Deserialising a flat JSON object into a complex object using JSON.NET

c#, json, json.net

Solution

You cannot use the default `JsonConvert` class of `JSON.Net` because it's not able to convert a flat json structure in a complex class. If I were in you I'll parse the json as a `Dictionary<string, string>` and then create your person class. Something like this:

Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
var person = new Person { 
                 FirstName = values["FirstName"] , 
                 LastName =  values["LastName "], 
                 PrivateData = new PrivateData {
                                   PassportNo = values["PassportNo"],
                                   NationalInsuranceNumber = values["NiNo"]
                                               }  
                 };

Problem

I am retrieving some JSON from an external API that I have no control over and need to deserialise that into an object where some of the fields are nested into a property of the main object so a straight deserialise won't work. The closest question I've found to my issue is: Json .Net serialize flat object into a complex object (change objects structure on serialization/deserialization) I couldn't really apply this to my problem though as i'm fairly new to using JSON.NET and still trying to understand how it works. A small sample to demonstrate of the json back from the API: ``` { FirstName: "John", LastName: "Smith", PassportNo: "xxxxx", NiNo: "xxxxx", } ``` The class(es) I want to deserialise into: ``` internal sealed class Person { [JsonProperty(PropertyName = "FirstName")] public string FirstName { get; set; } [JsonProperty(PropertyName = "LastName")] public string LastName { get; set; } public PrivateData PrivateData { get; set; } } internal sealed class PrivateData { [JsonProperty(PropertyName = "PassportNo")] public string PassportNo { get; set; } [JsonProperty(PropertyName = "NiNo")] public string NationalInsuranceNumber { get; set; } } ``` I wasn't sure how to go about implementing a custom contract resolver / JSON converter to attain the required results so any guidance would be appreciated.

Original source