gpt4 book ai didi

c# - 基于 .Net 中的字段反序列化 json (C#)

转载 作者:太空狗 更新时间:2023-10-29 19:54:49 26 4
gpt4 key购买 nike

我正在编写一个获取 Json 对象列表的应用程序,如下所示:

[
{
"ObjectType": "apple",
"ObjectSize": 35,
"ObjectCost": 4,
"ObjectTaste": "good",
"ObjectColor": "golden"
},
{
"ObjectType": "books",
"ObjectSize": 53,
"ObjectCost": 7,
"Pages": 100
},
{
"ObjectType": "melon",
"ObjectSize": 35,
"ObjectTaste": "good",
"ObjectCost": 5
},
{
"ObjectType": "apple",
"ObjectSize": 29,
"ObjectCost": 8,
"ObjectTaste": "almost good",
"ObjectColor": "red"
}
]

我想创建一个基类ItemToSell (size,cost),并从中派生出Apple、Melon和Book,然后根据"ObjectType进行反序列化"字段到它适合的任何类。我希望它构建一个 ItemToSell 对象列表,每个对象都是 Apple、Melon 或 Book。

我如何在 .Net 中执行此操作?

提前致谢:)

编辑:我知道如何在一个包含所有字段的大类中反序列化它,例如:Base(ObjectType,ObjectSize,ObjectCost,ObjectColor,Pages)。但我希望它通过 ObjectType 区分类,所以我不会有任何有用的字段,例如每本书的 Pages 字段或每本书的 ObjectTaste

最佳答案

前段时间我遇到了同样的问题。

您可以使用 Json.NET,但如果您无法控制 json 文档(如:“它已被其他框架序列化”),您将需要像这样创建一个自定义 JsonConverter :

class MyItemConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(ItemToSell).IsAssignableFrom(objectType);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject obj = JObject.Load(reader);
string discriminator = (string)obj["ObjectType"];

ItemToSell item;
switch (discriminator)
{
case "apple":
item = new Apple();
break;
case "books":
item = new Books();
break;
case "melon":
item = new Melon();
break;
default:
throw new NotImplementedException();
}

serializer.Populate(obj.CreateReader(), item);

return item;

}


public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{

}
}

然后您需要像这样将它添加到 JsonSerializerSettings 的转换器中:

JsonSerializerSettings settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,

};
settings.Converters.Add(new MyItemConverter());
var items = JsonConvert.DeserializeObject<List<ItemToSell>>(response, settings);

关于c# - 基于 .Net 中的字段反序列化 json (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23566980/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com