.NET反序列化JSON多种类型多种、类型、序列化、NET

2023-09-04 22:55:00 作者:凉城听暖

可能重复:   Deserializing JSON成几个C#的一个子类

我只读以下JSON模式访问:

I have read-only access following JSON schema:

{ items: [{ type: "cat", catName: "tom" }, { type: "dog", dogName: "fluffy" }] }

我想所有这些反序列化到各自的类型:

I would like to deserialize each of these to their respective type:

class Cat : Animal {
    string Name { get; set; }
}
class Dog : Animal {
    string Name { get; set; }
}

我在这一点上唯一的想法就是将它们反序列化到动态的对象,或词典<字符串,对象> ,然后从那里建造这些对象。

My only thought at this point is to deserialize them to a dynamic object, or Dictionary<string, object> and then construct these objects from there.

我可能会丢失从一个JSON的框架存在的东西....

I may be missing something from one of the JSON frameworks out there....

你会有什么办法呢? =]

What would your approach be? =]

推荐答案

我认为这是可能的,你需要反序列化JSON的,然后从那里建造的对象。直接反序列化到将不可能的,因为解串器将不知道如何具体构造这些对象

I think it's likely you'll need to deserialize the Json then construct the objects from there. Deserializing directly to Cat or Dog won't be possible as the deserializer won't know how to construct these objects specifically.

修改:从大量举债Deserializing异种JSON数组协名单,其中;&GT;使用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, 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());
 
精彩推荐
图片推荐