根据.Net(C#)中的字段反序列化json [英] Deserialize json based on fields in .Net (C#)

查看:167
本文介绍了根据.Net(C#)中的字段反序列化json的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个应用程序,该应用程序获得这样的对象的Json列表:

I'm writing an app that gets a Json list of objects like this:

[
   {
       "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(大小,成本),并从中派生Apple,Melon和Book,然后根据"ObjectType"字段对它适合的任何类进行反序列化.我希望它建立一个ItemToSell对象的列表,每个对象都是Apple,Melon或Book.

I want to make a base class ItemToSell (size,cost), and derive Apple, Melon and Book from it, then make the deserialization based on the "ObjectType" field to whatever class it fits. I want it to build a list of ItemToSell objects, every object being Apple, Melon or Book.

如何在.Net中做到这一点?

How could I do this in .Net?

先谢谢您了:)

我知道如何在Big类及其包含的所有字段中反序列化它,例如:Base(ObjectType,ObjectSize,ObjectCost,ObjectColor,Pages).但是我希望它通过ObjectType区分类,因此我不会有任何有用的字段,例如每本书的Pages字段或每本书的ObjectTaste.

I know how to deserialize it in a Big class with all the fields it can ever contain, like: Base(ObjectType,ObjectSize,ObjectCost,ObjectColor,Pages). But I want it to distinguish between classes by the ObjectType so I won't have any usefulness fields like Pages field for every book item or ObjectTaste for every book.

推荐答案

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

Some time ago I had the same problem.

您将可以使用Json.NET,但是如果您无法控制json文档(例如:它已被其他框架序列化"),则需要创建一个自定义JsonConverter,如下所示:

You'll can use Json.NET, but if you don't have control over the json document (as in: 'it has been serialized by some other framework') you'll need to create a custom JsonConverter like this:

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的转换器中,如下所示:

Then you'll need to add it to the converters of the JsonSerializerSettings like so:

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

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

这篇关于根据.Net(C#)中的字段反序列化json的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆