如何解决C#Newtonsoft.Json仅反序列化顶级代码吗?
我必须使用处理如下错误响应的API:
{
"error": {
"code": 3,"message": "error message"
}
}
成功是这样的:
{
"data": {
"key": "value"
}
}
错误响应将始终包含一个代码(整数)和一条消息(字符串),其中,成功响应可能会有所不同,范围从几个键值对到许多对象和数组。
我为每个成功的“数据”部分创建了类,并且可以成功解析它们。现在,我要用简单的部分来确定我得到的响应是错误的还是成功的响应。
我的想法是创建这些类:
public class APIResponse
{
[JsonProperty("error")]
public APIResponseError Error { get; set; }
[JsonProperty("data")]
public string Data { get; set; }
}
public class APIResponseError
{
[JsonProperty("code")]
public int Error { get; set; }
[JsonProperty("message")]
public string Message { get; set; }
}
并序列化为类APIResponse
。这仅适用于错误响应(很明显),因为数据响应不仅仅是APIResponse.Data
实际上是一个字符串。我的想法是不反序列化数据字段,而只是将其作为字符串存储在APIResponse.Data
中。然后,当我检查并发现错误为null
时,将使用正确的类反序列化APIResponse.Data
属性。但是我该怎么办呢?
解决方法
您可以将Data
属性的类型设置为JToken
:
public class APIResponse
{
[JsonProperty("error")]
public APIResponseError Error { get; set; }
[JsonProperty("data")]
public JToken Data { get; set; }
}
并稍后使用ToObject
反序列化:
myCorrectResponse.Data.ToObject<ExpectedDataType>()
但是我非常怀疑在发生错误响应的情况下是否会向您发送任何数据,因此我建议使APIResponse
通用(其中T
可以是对象,数组等):
public class APIResponse<T>
{
[JsonProperty("error")]
public APIResponseError Error { get; set; }
[JsonProperty("data")]
public T Data { get; set; }
}
在您的示例中,例如,将使用json:
class MyClass
{
[JsonProperty("key")]
public string Key { get; set; }
}
JsonConvert.DeserializeObject<APIResponse<MyClass>>(json);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。