繁体   English   中英

具有不同对象类型的Newtonsoft JSON反序列化数组

[英]Newtonsoft JSON deserializing array with differing object types

我正在尝试以最有效的方式对json数组中的不同对象类型进行反序列化,但是我真的看不到如何以任何直接的方式完成。 我正在使用Newtonsoft.Json库进行解析。

我已经建立了一个简单的示例来说明我要解决的问题,要绑定到的类以及正在使用的JSON格式,如下所示:

class Car
{
    public int Wheels { get; set; }
    public String Manufacturer { get; set; }
    public String Colour { get; set; }
    public double EngineSize { get; set; }
    public String Year { get; set; }
}

class Aeroplane
{
    public String Model { get; set; }
    public String Airline { get; set; }
    public int JourneyCount { get; set; }
}

class Ship
{
    public String Name { get; set; }
    public String Company { get; set; }
    public int Capacity { get; set; }
    public String YearBuilt { get; set; }
}

这是我要绑定到这些类的JSON。 它设置为在每个位置具有三种不同嵌套对象类型的数组。 基本上,数组中的每个元素/索引都包含三个对象,即汽车,飞机和轮船。

{[
  {
    "car": {
      "wheels": 4,
      "manufacturer": BMW,
      "colour": "Black",
      "engineSize": "1.6"
    },
    "aeroplane": null,
    "ship": null
  },
  {
    "car": {
      "wheels": 4,
      "manufacturer": BMW,
      "colour": "Black",
      "engineSize": "1.6"
    },
    "aeroplane": {
        "model": "Dreamliner",
        "airline": "Emirates",
        "journeyCount": 4798
    },
    "ship": {
        "name":"Queen Mary",
        "company":"Cunard",
        "capacity": 890,
        "yearBuilt": 2000
    }
  },
  {
    "car": {
      "wheels": 4,
      "manufacturer": BMW,
      "colour": "Black",
      "engineSize": "1.6"
    },
    "aeroplane": {
        "model": "Boeing 777",
        "airline": "BA",
        "journeyCount": 6158
    },
    "ship": {
        "name":"HMS Diamond",
        "company":"Royal Navy",
        "capacity": 500,
        "yearBuilt": 2010
    }
  }
]}

首先,您的json无效。 要使其有效,您需要去除顶部的花括号。 也有一些遗漏的报价。 您可以使用JSON Lint进行验证。 它看起来应该像这样:

[
    {
        "car": {
            "wheels": 4,
            "manufacturer": "BMW",
            "colour": "Black",
            "engineSize": "1.6"
        },
        "aeroplane": null,
        "ship": null
    },
    {
        "car": {
            "wheels": 4,
            "manufacturer": "BMW",
            "colour": "Black",
            "engineSize": "1.6"
        },
        "aeroplane": {
            "model": "Dreamliner",
            "airline": "Emirates",
            "journeyCount": 4798
        },
        "ship": {
            "name": "Queen Mary",
            "company": "Cunard",
            "capacity": 890,
            "yearBuilt": 2000
        }
    },
    {
        "car": {
            "wheels": 4,
            "manufacturer": "BMW",
            "colour": "Black",
            "engineSize": "1.6"
        },
        "aeroplane": {
            "model": "Boeing 777",
            "airline": "BA",
            "journeyCount": 6158
        },
        "ship": {
            "name": "HMS Diamond",
            "company": "Royal Navy",
            "capacity": 500,
            "yearBuilt": 2010
        }
    }
]

您还需要一堂课来包装汽车,飞机和轮船:

public class VehicleWrapper
{
    public Car Car { get; set; }

    public Aeroplane Aeroplane { get; set; }

    public Ship ship { get; set; }
}

现在,您可以使用以下行反序列化它:

List<VehicleWrapper> vehicles = JsonConvert.DeserializeObject<List<VehicleWrapper>>(jsonString);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM