2014-05-22 118 views
0

我试图以最有效的方式反序列化json数组内的不同对象类型,但我无法真正看到如何以任何直接的方式完成此操作。我正在使用Newtonsoft.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 
    } 
    } 
]} 

回答

4

首先你的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); 
+0

呀我只是意识到我粘贴了JSON的旧版本,道歉并且很好地被发现。谢谢,我会尝试。 – nickyh62

+0

不需要感谢,如果它解决了您的问题,请将其标记为答案。 –

相关问题