Home > OS >  Deserialize JSON containing property of type object
Deserialize JSON containing property of type object

Time:04-13

What is the best way to JSON deserialize when a property is of type object and can contain primitive or complex data types.

public class ComplexData { public string Name {get;set; }

    public class Info {
     // other properties
      public object Value {get;set;}
    }

JsonConvert.DeserializeObject<List<Info>>(jsonText); will not deserialize the 'Value' if it's for example assigned with a List.

CodePudding user response:

In order to support the dynamic deserialization of the JSON content, you can use a custom JsonConverter that analyzes the JSON content and creates the correct class. The following sample shows the deserialization if the value can be an integer or an object:

Sample JSON

[
  {
    "Name": "A",
    "Info": { "Value": 3 }
  },
  {
    "Name": "B",
    "Info": {
      "Value": { "Text": "ABC" }
    }
  }
]

.NET types

public class ComplexData
{
    public string Name { get; set; }

    public Info Info { get; set; }
}

public class Info
{
    // other properties
    [JsonConverter(typeof(ValueJsonConverter))]
    public object Value { get; set; }
}

public class ComplexSubData
{
    public string Text { get; set; }
}

Custom JSON converter

public class ValueJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Integer)
            return Convert.ToInt32(reader.Value);
        return serializer.Deserialize<ComplexSubData>(reader);
    }

    public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

The custom converter is applied to the property using the JsonConverter attribute. If your structure is more complex, you can adjust the ReadJson method to discern between the types.

  • Related