![](/img/trans.png)
[英]Deserializing JSON data containing a varying number of parameters to C# (using Json.NET)
[英]Deserializing JSON with varying schemas
我将JSON.Net与.NET 4.7一起使用。
在我调用的API中,对于同一个调用,我看似随机地会得到两种错误json :(。
错误类型1:
{
"Code": 0,
"Msg": ["Some Warning"]
}
错误类型2:
{
"Code": 0,
"Msg": [
{"Error": 5 },
{"Error": 6 }
]
}
如您所见, Msg
更改了其结构。 我想要一个通用的POCO进行反序列化,但是Msg
何时发生变化?
JsonConvert.DeserializeObject<MyCommonPoco>(theJson);
您可以编写一个自定义的JsonConverter
来处理不同的类型。 例如,您可以具有以下JSON:
{
"Code": 0,
"Msg": [
"A single string",
{ "Message": "An object with a message" },
{ "Message": "An object with a message and a code", "Code": 5 },
{ "Code": 5 }
]
}
在此的示例Msg
数组可以包含原始字符串或复杂的对象。 该对象可以包含Message
, Code
或两者。
您将为此选择最通用的数据结构,该数据结构能够表示所有这些信息。 例如,这意味着您将必须将该原始字符串包装到兼容对象中。
public class Error
{
public int Code { get; set; }
public ErrorMessage[] Msg { get; set; }
}
public class ErrorMessage
{
public string Message { get; set; }
public int? Code { get; set; }
}
然后,您可以使用自定义
然后,使用自定义JsonConverter
,您可以解析上述JSON:
public class ErrorMessageConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
=> objectType == typeof(ErrorMessage);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
// handle the primitive string
if (reader.TokenType == JsonToken.String)
return new ErrorMessage { Message = (string)reader.Value };
// handle a complex object; just assume that it is an `ErrorMessage` here
else if (reader.TokenType == JsonToken.StartObject)
return JObject.Load(reader).ToObject<ErrorMessage>();
throw new NotSupportedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
这将是使用该转换器的一种方式:
// the single quotes are just here to make it more readable; JSON.NET support this
// although it isn’t valid JSON
var json = @"{
'Code': 0,
'Msg': [
'A single string',
{ 'Message': 'An object with a message' },
{ 'Message': 'An object with a message and a code', 'Code': 5 },
{ 'Code': 5 }
]
}";
var settings = new JsonSerializerSettings()
settings.Converters.Add(new ErrorMessageConverter());
var result = JsonConvert.DeserializeObject<Error>(json, settings);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.