簡體   English   中英

如何將 json 轉換為對象,如 CQRS 設計模式

[英]how to convert json to object, like CQRS design pattern

我有一個問題,我需要將 json 轉換為 C# 對象。 但是這個 json 可以有不同的屬性,這使得在轉換時有必要像使用 switch case 一樣檢查對象是否有效。

我在 CQRS 中看到設計模式似乎有一些共同點,有人知道它是如何工作的嗎? 以便我可以實施它。

     public List<Event> process(CreateOrderCommand cmd) {
    return EventUtil.events(new OrderCreatedEvent(cmd.getCustomerId(), cmd.getOrderTotal()));
  }

  public List<Event> process(ApproveOrderCommand cmd) {
    return EventUtil.events(new OrderApprovedEvent(customerId));
  }

  public List<Event> process(RejectOrderCommand cmd) {
    return EventUtil.events(new OrderRejectedEvent(customerId));
  }

如您所見,所有方法名稱都相同,但參數不同。 我想實現這一點,以便當我得到 json 時,它將根據有效對象進行轉換。

我目前所做的:

      public bool TryParseJson<T>(string @this, out T result)
    {
        bool success = true;
        var settings = new JsonSerializerSettings
        {
            Error = (sender, args) => { success = false; args.ErrorContext.Handled = true; },
            MissingMemberHandling = MissingMemberHandling.Error
        };
        result = JsonConvert.DeserializeObject<T>(@this, settings);
        return success;
    }

    public void Process(JObject query)
    {
        RandomUser randomUser;
        RecurringProcess recurringProcess;
        if (TryParseJson(query.ToString(), out randomUser))
        {
            //do something with the object
        }
        else if (TryParseJson(query.ToString(), out recurringProcess))
        {
            //do something with the object
        }
    }

我認為這與 CQRS 沒有任何關系。 如果您想確定您正在構造一個有效的對象,請使用 Newtonsoft.JSON 的功能使用帶參數的構造函數反序列化您的 JSON。 根據您的需要定制對象的構造函數,這樣您就可以保證自己總是在構造一個有效的對象。 如果存在驗證錯誤,則拋出必要的異常並在此過程中捕獲它們。

我會建議你使用模式。 您可以使用 JSON.Net 創建一個 JSON 模式並根據該模式驗證 JSON 文件,如下所示:

JsonSchema schema = JsonSchema.Parse(jsonSchema);
JObject obj = JObject.Parse(jsonString);
bool valid = obj.IsValid(schema);

所以,你可以根據你的需要做這樣的事情。

// initialize this dictionary somewhere which maps schemas to command classes
Dictionary<JsonSchema, CommandBaseClass> jsonSchemaToCommandMapping;

public CommandBaseClass FindCommand(string @this, out DeserializeObjectsBaseType result)
{
    // loop through schemas in the jsonSchemaToCommandMapping
    // to find out which command class to use

    return calculatedCommand;
}

public void Process(JObject query)
{
    var commandClass = FindCommand(query.ToString(), out DeserializeObjectsBaseType deserializeObject);
    // remember to check if command is null. maybe it was not found
    commandClass?.Process(deserializeObject);
}

但請記住,我快速制作的這個例子很短,而且不是最漂亮的。 只是想告訴你我的想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM