Deserialise nested JSON with Newtonsoft and C#

≯℡__Kan透↙ 提交于 2020-01-04 06:09:46

问题


I am trying to parse a Json response form a Rest API. I can get the response fine and have created some class Models. I am using Newtonsoft's Json.Net.

I keep getting null values in my response and am not sure if I have setup my Models correct or am missing something?

What I am trying to get is for example, Firstname and ReferenceNumber which are in Data\Items\Employee

An example of my Json response is:

{
"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."
      }
    ]
  }
]
}
}

My Models are setup as shown below:

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; }
}

In my Controller I am doing the following:

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

All I see when debugging is Items and Links which are both null. I'm not really sure what I am doing wrong or how I get this to work so I can access the values in my C# code? Any help would be appreciated. The application is MVC3. The examples I've seen are using simple json structures.


回答1:


The JSON string doesn't fit the Data class from the viewpoint of the deserializer. It sees a root object with a single property named "Data", while it expects to see an object with "Items" and "links" properties. So it just constructs a Data instance, and leaves its properties null.

To fix it, remove the wrapping object, so you're left with the following: { "Items" : [..], "Links" : [...] }

and try deserializing again.




回答2:


I managed to fix this. What i did was to first create the parent class to deal with the Data object, as @Jake had also mentioned. I created a class of type ClientDetails which I had in the Employee class as follows:

public ClientDetails clientDetails {get; set;}

This caused an error as ClientDetails is an array. I changed this to the following:

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

This fixed the problem and now my whole Data object is populated with the response from the API.

@Jake, thanks for your input...



来源:https://stackoverflow.com/questions/11520378/deserialise-nested-json-with-newtonsoft-and-c-sharp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!