Deserialise nested JSON with Newtonsoft and C#

11,098

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.

Share:
11,098
KDee
Author by

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, 2022

Comments

  • KDee
    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
    KDee almost 12 years
    Hi 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?