Error when deserializing JSON to Object

You are trying to deserialize into a List but your JSON actually represents a single object containing a data property containing list of objects. That is why you are getting this error. Json.Net can't deserialize a single object into a list.

Please try this:Create a class which contain single property on datatype Object and pass this class for deserialization.

class Parent
{
    public object Data { get; set;}
}

Then deserialize like this:

var output = JsonConvert.DeserializeObject<Parent>(jsonData);

What you're looking for is the dynamic type. Though unrelated, this answer contains much of the information on how you'll be able to iterate through the changing properties on your object.

You will need to add some additional work to figure out how to handle your result when it is an array versus a single object as your error shows us. However, this is a good first step for you.

Basically, a dynamic object is a Dictionary, much like how a JSON object is treated in JavaScript. You just need to iterate through each of the KeyValuePair objects within the main object and go through their properties.

var data = JsonConvert.DeserializeObject<dynamic>(jsonData);
var rows = new List<string>();

// Go through the overall object, and get each item in 
// the array, or property in a single object.
foreach (KeyValuePair<string, object> item in data)
{
    dynamic obj = item.Value;
    var row = "";

    // Perhaps add a check here to see if there are more
    // properties (if it is an item in an array). If not
    // then you are working with a single object, and each
    // item is a property itself.
    foreach (KeyValuePair<string, object> prop in obj)
    {
        // Very dummy way to demo adding to a CSV
        string += prop.Value.ToString() + ",";
    }

    rows.Add(string);
}

This is far from a complete example, but we don't have enough information to go on to help you finish what you're trying to do.


The real issue here is that you are trying to deserialize into a List<object> but your JSON actually represents a single object containing a data property which then contains a list of objects. That is why you are getting this error. Json.Net can't deserialize a single object into a list. I think what you really want to do is define a container class like this:

class Root
{
    public List<Dictionary<string, object>> Data { get; set;}
}

Then deserialize like this:

var data = JsonConvert.DeserializeObject<Root>(jsonData).Data;

You will then end up with a list of dictionaries, where each dictionary represents one item in the JSON array. The dictionary key-value pairs are the dynamic values in each item. You can then work with these as you would with any other dictionary. For example, here is how you would dump out all the data:

foreach (var dict in data)
{
    foreach (var kvp in dict)
    {
        Console.WriteLine(kvp.Key + ": " + kvp.Value);
    }
    Console.WriteLine();
}

Fiddle: https://dotnetfiddle.net/6UaKhJ

Tags:

C#

Json

Json.Net