反序列化 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);
当 属性 是对象类型并且可以包含原始或复杂数据类型时,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);