基于其他属性 c#将属性反序列化为不同的class

Deserialize property to different class based on other property c#

我知道在 SO 上有很多类似的问题,但是我发现的所有问题都需要一个共享基础 class 才能工作。

像这样的 JSON 数据流:

[
  {
    "webhookType": "order",
    "data": {
      "id": "eeiefj393",
      "orderProperty": "Value"
    }
  },
  {
    "webhookType": "customer",
    "data": {
      "id": 29238,
      "customerProperty": "Value"
    }
  }
]

我希望将其反序列化为两个容器,List<Customer>List<Order>。其中两个classes如下:

class Order
{
    public string Id { get; set; }
    public string OrderProperty { get; set; }
    [...]
}

class Customer
{
    public long Id { get; set; }
    public string CustomerProperty { get; set; }
    [...]
}

可能有共享 属性 名称,但是这两个 class 之间没有共享属性 + 类型,因此涉及子 class 的解决方案对我不起作用.

您需要创建一个 JsonConverter

数据转换器

public class WebHookConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.StartObject)
        {
            JObject item = JObject.Load(reader);

            if (item["webhookType"].Value<string>() == "order")
            {
                var webhook = new WebHook
                {
                    Type = item["webhookType"].Value<string>(),
                    Data = item["data"].ToObject<Order>()
                };

                return webhook;
            }
            else if (item["webhookType"].Value<string>() == "customer")
            {
                var webhook = new WebHook
                {
                    Type = item["webhookType"].Value<string>(),
                    Data = item["data"].ToObject<Customer>()
                };

                return webhook;
            }
        }

        return null;
    }

    public override bool CanConvert(Type objectType)
    {
        throw new NotImplementedException();
    }
}

对象

[JsonConverter(typeof(WebHookConverter))]
public class WebHook
{
    [JsonProperty("webhookType")]
    public string Type { get; set; }
    public object Data { get; set; }
}

public class Order
{
    public string Id { get; set; }

    [JsonProperty("orderProperty")]
    public string Property { get; set; }
}

public class Customer
{
    public long Id { get; set; }

    [JsonProperty("customerProperty")]
    public string Property { get; set; }
}

序列化

var json = File.ReadAllText("json1.json");
var obj = JsonConvert.DeserializeObject<List<WebHook>>(json);

var orderList = obj.Where(o => o.Type == "order").Select(o => o.Data).ToList();
var customerList = obj.Where(o => o.Type == "customer").Select(o => o.Data).ToList();

输出: