c# - 使用不同的模式反序列化 JSON
问题描述
我将 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
数组可以包含原始字符串或复杂对象。该对象可以包含 a Message
、 aCode
或两者兼有。
您将为此选择最常见的数据结构,一种能够表示所有信息的数据结构。例如,这意味着您必须将该原始字符串包装到兼容的对象中。
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; }
}
然后,您可以使用自定义
然后,使用 custom 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);
推荐阅读
- c# - 请求失败状态代码 200 状态文本 BADRESPONSE:意外令牌“<”
- javascript - 无法解决对 Express API 的 AJAX 调用的 CORS 错误
- nginx - 音频和视频不同步流式 USB 网络摄像头到 RTMP 服务器
- .net - 如何在 .Net MVC 上查看刷新时的反应变化?
- npm - 如何在 Visual Studio Code 上安装 discord.js?
- c# - 找不到 System.Windows.Forms 程序集参考
- javascript - 如何将JS字节码行号映射到源代码行号
- r - 如何在 R Dataframe 中按降序排列月份
- c++ - 构建包 libmariadb:x64-windows 失败:BUILD_FAILED
- javascript - 自定义 if 指令未显示预期结果