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

C# 基于其他属性c将属性反序列化为不同的类#,c#,json,json.net,deserialization,system.text.json,C#,Json,Json.net,Deserialization,System.text.json,我知道有很多类似的问题,但是我发现的所有问题都需要一个共享的基类才能工作 使用JSON数据流,如下所示: [ { "webhookType": "order", "data": { "id": "eeiefj393", "orderProperty": "Value" } }, { &quo

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

使用JSON数据流,如下所示:

[
  {
    "webhookType": "order",
    "data": {
      "id": "eeiefj393",
      "orderProperty": "Value"
    }
  },
  {
    "webhookType": "customer",
    "data": {
      "id": 29238,
      "customerProperty": "Value"
    }
  }
]
我希望将其反序列化为两个容器,
List
List
。其中两个类别如下:

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

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

可能存在共享属性名称,但这两个类之间没有共享属性+类型,因此涉及子类的解决方案不适用于我。

您需要创建一个
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();
    }
}
序列化

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();
var json=File.ReadAllText(“json1.json”);
var obj=JsonConvert.DeserializeObject(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();
输出:

啊,太好了。我只是找不到一个不使用基类的JsonConverter示例。
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();