我正在编写一个获取 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/