gpt4 book ai didi

.NET 将 JSON 反序列化为多种类型

转载 作者:行者123 更新时间:2023-12-03 12:34:13 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:




8年前关闭。




Possible Duplicate:
Deserializing JSON into one of several C# subclasses



我具有以下 JSON 架构的只读访问权限:
{ items: [{ type: "cat", catName: "tom" }, { type: "dog", dogName: "fluffy" }] }

我想将这些反序列化为各自的类型:
class Cat : Animal {
string Name { get; set; }
}
class Dog : Animal {
string Name { get; set; }
}

此时我唯一的想法是将它们反序列化为 dynamic对象,或 Dictionary<string, object>然后从那里构造这些对象。

我可能在其中一个 JSON 框架中遗漏了一些东西......

你的方法是什么? =]

最佳答案

我认为您可能需要反序列化 Json,然后从那里构造对象。直接反序列化为 CatDog不可能,因为反序列化器不知道如何专门构造这些对象。

编辑 : 从 Deserializing heterogenous JSON array into covariant List<> using JSON.NET 大量借款

像这样的事情会起作用:

interface IAnimal
{
string Type { get; set; }
}

class Cat : IAnimal
{
public string CatName { get; set; }
public string Type { get; set; }
}

class Dog : IAnimal
{
public string DogName { get; set; }
public string Type { get; set; }
}

class AnimalJson
{
public IEnumerable<IAnimal> Items { get; set; }
}

class Animal
{
public string Type { get; set; }
public string Name { get; set; }
}

class AnimalItemConverter : Newtonsoft.Json.Converters.CustomCreationConverter<IAnimal>
{
public override IAnimal Create(Type objectType)
{
throw new NotImplementedException();
}

public IAnimal Create(Type objectType, JObject jObject)
{
var type = (string)jObject.Property("type");

switch (type)
{
case "cat":
return new Cat();
case "dog":
return new Dog();
}

throw new ApplicationException(String.Format("The animal type {0} is not supported!", type));
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
// Load JObject from stream
JObject jObject = JObject.Load(reader);

// Create target object based on JObject
var target = Create(objectType, jObject);

// Populate the object properties
serializer.Populate(jObject.CreateReader(), target);

return target;
}
}

string json = "{ items: [{ type: \"cat\", catName: \"tom\" }, { type: \"dog\", dogName: \"fluffy\" }] }";
object obj = JsonConvert.DeserializeObject<AnimalJson>(json, new AnimalItemConverter());

关于.NET 将 JSON 反序列化为多种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12832306/

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