【问题标题】:how to convert json to object, like CQRS design pattern如何将 json 转换为对象,如 CQRS 设计模式
【发布时间】:2020-09-04 19:16:50
【问题描述】:

我有一个问题需要将 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
        }
    }

【问题讨论】:

    标签: c# asp.net-web-api cqrs


    【解决方案1】:

    我认为这与 CQRS 无关。如果您想确定您正在构建一个有效的对象,请使用 Newtonsoft.JSON 的功能来使用带参数的构造函数反序列化您的 JSON。根据您的需要定制对象的构造函数,这样您就可以保证自己始终在构造一个有效的对象。 如果存在验证错误,则抛出必要的异常并在此过程中捕获它们。

    【讨论】:

      【解决方案2】:

      我会建议你使用模式。您可以使用 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);
      }
      

      但请记住,我快速制作的这个例子很短,而且不是最漂亮的。 这只是向你展示我的想法。

      【讨论】:

      • findCommand 是做什么的?什么是 CommandBaseClass ?
      • 很抱歉我的例子是错误的。 FindCommand 函数是示例中的第一个函数。我添加了一些关于它应该做什么的 cmets。它将遍历 jsonSchemaToCommandMapping 中的模式并返回正确的命令类。每个 json 模式都有对应的命令类,所以这里正确的命令类是指您应该为特定模式选择的类。 CommandBaseClass 是您拥有的所有 Command 类的基类。前任。 CreateOrderCommand、ApproveOrderCommand 等它将是这些的基类。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 2023-03-17
      • 2020-01-17
      • 1970-01-01
      • 2021-11-23
      • 2016-12-31
      相关资源
      最近更新 更多