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

标签 c# .net json field deserialization

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

相关文章:

javascript - getJSON 错误处理 - 使用 2 个 API

c# - : The first instance of an app will execute a process, second instance will kill the process later 怎么办

c# - 使用 System.IdentityModel.Tokens.Jwt 从 1.1 迁移到 2.0 后,JWTAuthentication 在 asp.net core 2.0 中不起作用 - 5.1.4 更新

c# - 在 Dynamic LINQ 中使用 Contains 时,如何将动态类型转换为字符串?

c# - 我可以检测我是否被赋予了一个新对象作为参数吗?

.net - 查找字符串,然后使用正则表达式向后查找另一个字符串

c# - 我可以在没有 HttpClient 缓冲整个请求的情况下将 PushStreamContent 添加到 MultipartFormDataContent 吗?

javascript - JSON.parse 解析 JSON.stringify 输出,但不解析字符串本身

jQuery .push() 不工作

c# - System.Console.WriteLine 在单元测试中不显示输出