反序列化 JSON 包含 属性 类型的对象

Deserialize JSON containing property of type object

当 属性 是对象类型并且可以包含原始或复杂数据类型时,JSON 反序列化的最佳方法是什么。

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

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

JsonConvert.DeserializeObject<List<Info>>(jsonText); 不会反序列化 'Value',如果它被分配了一个列表。

为了支持 JSON 内容的动态反序列化,您可以使用自定义 JsonConverter 来分析 JSON 内容并创建正确的 class。以下示例显示了值可以是整数或对象时的反序列化:

样本JSON

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

.NET 类型

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; }
}

自定义JSON转换器

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();
    }
}

使用 JsonConverter 属性将自定义转换器应用于 属性。如果您的结构比较复杂,您可以调整 ReadJson 方法来区分类型。

您可以使用泛型。例如:

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

public class Info<T> {
 // other properties
    public T Value {get;set;}
}

当您想使用时:

var myObj = JsonConvert.DeserializeObject<Info<ComplexData>>(jsonStr);