Deserialise nested JSON with Newtonsoft and C#
Solution 1
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...
Solution 2
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.
KDee
BY DAY: Developer by trade using mainly Microsoft technologoes (.NET, MVC, C#) Don't like learning curves but find they are a necessity in this trade! BY NIGHT: Sleeping usually.
Updated on June 04, 2022Comments
-
KDee almost 2 years
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.
-
KDee almost 12 yearsHi Jake, I've created a parent class to deal with the Data class. I've now got a bit of it working. The problem seems to be the nested ClientDetails object that needs to map to a class. I've created that class also but get an error telling me that ClientDetails requires a JSON object to deserialize correctly. That might be JArray or something but not sure how to use that with the response?