2015-09-11 90 views
1

我有以下從REST服務來用下列JSON,我試圖用這個代碼把它反序列化到C#對象:C#中將此Json轉換爲什麼正確的類結構?

var _deserializer = new JsonDeserializer(); 
var results = _deserializer.Deserialize<Report>(restResponse); 

的反序列化方法保持返回NULL,它告訴我,我的C#對象不結構正確。

以下是Json和我在C#定義中的最新嘗試。

{ 
    "Report": [ 
     { 
      "ID": "0000014", 
      "Age": "45", 
      "Details": [ 
       { 
        "Status": "Approved", 
        "Name": "Joe" 
       }, 
       { 
        "Status": "Approved", 
        "Name": "Bill" 
       }, 
       { 
        "Status": "Submitted", 
        "Name": "Scott" 
       } 
      ] 
     }, 
     { 
      "ID": "10190476", 
      "Age": "40", 
      "Details": [ 
       { 
        "Status": "Approved", 
        "Name": "Scott" 
       } 
      ] 
     }, 
     { 
      "ID": "10217480", 
      "Age": "40", 
      "Details": [ 
       { 
        "Status": "Approved", 
        "Name": "Scott" 
       } 
      ] 
     } 
    ] 
} 

這裏是我的C#對象:

public class Report 
{ 
    public List<WorkItem> Item= new List<WorkItem>(); 
} 

public class WorkItem 
{ 
    public string ID { get; set; } 
    public int Age { get; set; } 

    public List<Details> Details { get; set; } 
} 

public class Details 
{ 
    public string Status { get; set; } 
    public string Name { get; set; } 
} 

能有人建議有什麼不對我的C#對象的定義,使這個JSON反序列化正確?

+0

以一致格式和縮進的JSON查看格式(因此回答問題)要容易得多。我通過http://jsonlint.com爲你運行它。 –

+0

也許它是Report類的Item成員。如果你把它寫成:'public List Item {get;組; },就像@tam回答 –

回答

3

我會建議使用Json2Csharp.com生成的類。

public class Detail 
{ 
    public string Status { get; set; } 
    public string Name { get; set; } 
} 

public class Report 
{ 
    public string ID { get; set; } 
    public string Age { get; set; } 
    public List<Detail> Details { get; set; } 
} 

public class RootObject 
{ 
    public List<Report> Report { get; set; } 
} 
2

嘗試改變報告類像這樣(類名可以是任何東西,財產必須報告)

public class WorkReport 
{ 
    public List<WorkItem> Report; 
} 

應該試圖在根反序列化到一個類的數組/列表稱爲Report的工作項目對象。

0

你可以嘗試這樣的事情。我已將List更改爲Dictionary您沒有在根級別定義的類。類結構需要匹配整個JSON,你不能從中間反序列化。每當你有一個對象的鍵可以改變,你需要使用一個詞典。一個普通班級不會爲此工作;一個List也不會。

public class RootObject 
{ 
    [JsonProperty("Report")] 
    public Report Reports { get; set; } 
} 
public class Report 
{ 
    [JsonProperty("Report")] 
    public Dictionary<WorkItem> Item; 
} 

public class WorkItem 
{ 
    [JsonProperty("ID")] 
    public string ID { get; set; } 
    [JsonProperty("Age")] 
    public int Age { get; set; } 
    [JsonProperty("Details")] 
    public Dictionary<Details> Details { get; set; } 
} 

public class Details 
{ 
    [JsonProperty("Status")] 
    public string Status { get; set; } 
    [JsonProperty("Name")] 
    public string Name { get; set; } 
} 

然後,反序列化是這樣的:

Report results = _deserializer.Deserialize<Report>(restResponse);