2012-07-17 48 views
2

我想解析一个休息API的Json响应。我可以得到很好的答复,并创建了一些类模型。我正在使用Newtonsoft的Json.Net。Deserialise嵌套的JSON与Newtonsoft和C#

我不断收到空值在我的回应,我不知道如果我已经安装我的模型正确或缺少的东西?

什么我试图得到的是例如,名字和ReferenceNumber这是在数据\项目\员工

我的JSON响应的例子:

{ 
"Data": { 
    "Links": [ 
    { 
    "Rel": "parent", 
    "Href": "http://Api/url/", 
    "Title": "Api", 
    } 
], 
    "Items": [ 
    { 
    "Employee": { 
    "ReferenceNumber": "0078952", 
    "EmployeeStatus": { 
    "Name": "Active", 
    "Value": 2 
    }, 
    "ContactByPost": true, 
    "ContactByMarketingEmails": true, 
    "ClientDetails": [ 
    { 
     "LimitedCompany": { 
     "Id": "809f4455-673d-df11-9849-00155d072900", 
     "Name": "Company" 
     }, 
     "ClientCompany": { 
     "Id": "62494f0c-617d-412f-81a3-ca40ef80f774", 
     "Name": "Company 2" 
     }, 
     "Code": "G67D", 
     "RefCode": "1271", 
     "Date": "\/Date(1333456265000+0100)\/", 
     "Id": "009ea227-887d-e111-96ec-000c29128cee", 
     "CreatedOn": "\/Date(1333455954000+0100)\/", 
     "CreatedBy": { 
     "Id": "5c2cb5eb-7368-e111-96eb-000c29128cee", 
     "Name": "System Administrator" 
     }, 
     "Archived": false 
    } 
    ], 
    "Title": { 
    "Name": "Mr", 
    "Value": 1 
    }, 
    "FirstName": "Fred", 
    "MiddleName": null, 
    "LastName": "Flintstone", 
    "KnownAs": null, 
    "DateOfBirth": "\/Date(315576000000+0000)\/", 
    "Gender": { 
    "Name": "Male", 
    "Value": 1 
    }, 
    "HomePhoneNumber": "55555555555", 
    "MobilePhoneNumber": null, 
    "Addresses": null, 
    "EmailAddresses": null, 
    "Id": "009ea227-887d-e111-96ec-000c29128cee", 
    "CreatedOn": "\/Date(1333455954000+0100)\/", 
    "CreatedBy": { 
    "Id": "5c2cb5eb-7368-e111-96eb-000c29128cee", 
    "Name": "System Administrator" 
    }, 
    "Archived": false 
}, 
    "Links": [ 
     { 
     "Rel": "list", 
     "Href": "http://Api/Addresses", 
     "Title": "Addresses", 
     "Description": "Get a list of addresses for this Employee." 
     } 
    ] 
    } 
] 
} 
} 

我的模型是建立如图所示如下:

public class Data 
{ 
    public Collection<Links> Links { get; set; } 
    public Collection<Items> Items { get; set; } 
} 
public class Items 
{ 
    public Employee Employee { get; set; } 
} 
public class Employee 
{ 
    public string ReferenceNumber { get; set; } 
    public string FirstName { get; set; } 
    public string MiddleName { get; set; } 
    public string LastName { get; set; } 
    public string Id { get; set; } 
} 
public class Links 
{ 
    public string Rel { get; set; } 
    public string Href { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
} 

在我的控制器我做了以下内容:

Data data = Newtonsoft.Json.JsonConvert.DeserializeObject<Data>(APIResponse); 

我在调试时看到的是Items和Links都是null。我不确定我在做什么错误,或者我如何让这个工作,所以我可以访问我的C#代码中的值?任何帮助,将不胜感激。该应用程序是MVC3。我见过的例子是使用简单的json结构。

回答

0

我设法解决这个问题。我所做的就是首先创建父类来处理Data对象,就像@Jake也提到的那样。我创建了一个类类型ClientDetails的其中我在Employee类,如下所示:

public ClientDetails clientDetails {get; set;} 

这造成了一个错误作为ClientDetails是一个数组。我改变了以下内容:

public List<ClientDetails> clientDetails {get; set;} 

这解决了这个问题,现在我的整个数据对象都填充了来自API的响应。

@Jake,感谢您的输入...

7

从解串器的角度看,JSON字符串不适合Data类。 它看到一个具有名为“Data”的单个属性的根对象,而它期望看到具有“Items”和“links”属性的对象。 所以它只是构造一个Data实例,并将其属性留空。

要修复它,去掉包装的对象,所以你留下了以下内容: { “项目”:[..], “链接”:[...]}

,并尝试反序列化再次。

+0

嗨杰克,我创建了一个处理Data类的父类。我现在有一些工作。问题似乎是需要映射到类的嵌套的ClientDetails对象。我也创建了这个类,但得到一个错误,告诉我ClientDetails需要一个JSON对象才能正确地反序列化。这可能是JArray或其他东西,但不知道如何使用它与响应? – KDee 2012-07-17 11:15:08