C# 基于其他属性c将属性反序列化为不同的类#
我知道有很多类似的问题,但是我发现的所有问题都需要一个共享的基类才能工作 使用JSON数据流,如下所示: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
[
{
"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();