c# - 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);
推荐阅读
- debian - NIC 上的 PHC2sys 和 Syscall 需要很长时间
- python - Python比较来自同一字典的键值不起作用
- docker - 与 docker builder 阶段共享 go 模块
- typescript - 当比较 any 到 void 为什么类型是联合?
- linux-kernel - 硬件中断使用哪个堆栈?
- docker - 如何从 minikube 公开服务以便能够从同一网络中的另一台设备访问它?
- azure - 如何在 Pulumi Azure Native 中使用 TagAtScope 创建资源后添加标签
- r - 如何找到一列的总和?
- javascript - 在 React 客户端集成 websocket
- java-11 - 注册 Hibernate 5 事件监听器