2015-09-11 43 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);