2014-05-22 188 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

不需要感謝,如果它解決了您的問題,請將其標記爲答案。 –

相關問題