c# - 将 JSON 属性反序列化为不同的类属性
问题描述
我收到来自第 3 方的类型不明确的 API 响应。对于某些方法,它是:
{"error":{"message":"Resource is already part of this app","status_code":400}}
在其他电话中,它是:
{"error": "Resource is already part of this app" }
是否可以将此类响应反序列化为:
public class Response
{
[JsonProperty("error")]
public string Error { get; set; }
[JsonIgnore] //[JsonProperty("error")]
public ObjectError ObjectError { get; set; }
}
public class ObjectError
{
[JsonProperty("message")]
public string Message { get; set; }
[JsonProperty("status_code")]
public string StatusCode { get; set; }
}
更新
所以我最终使用对象作为反序列化的全部捕获。
[JsonProperty("error")]
public object Error { get; set; }
public string ErrorAsString => Error is string ? Error.ToString() : null;
public ObjectError ErrorAsObject => Error is string ? null : Error != null ? JsonConvert.DeserializeObject<ObjectError>(Error.ToString()) : null;
这并不理想,我知道。
解决方案
您可以使用 NetosoftJson 轻松完成此操作。在这里,您可以检查如何使用它反序列化为对象。
您始终可以解析 JSON 对象并检查它是否具有特定字段。例如:
JObject json = JObject.Parse(jsonString);
if(json.HasKey("message"))
{
var result = JsonConvert.DeserializeObject<ObjectError>(jsonString);
// Do some stuff here
}
else
{
var result = JsonConvert.DeserializeObject<Response>(jsonString);
// Do some stuff here
}
推荐阅读
- merge - 如何在 Debian 10 上合并 2 个已安装的卷?
- angular - 不能使用 ngx-mat-file-input
- excel - Powershell:突出显示excel单元格内部使用条件
- javascript - 为什么在 React 中使用 .map() 时需要扩展运算符,但在纯 JavaScript 中不需要?
- ios - 在 SwiftUI 中运行时创建控件
- powershell - msExchDelegateListBL 属性 - 无法修改该属性,因为它归系统所有
- r - `prcomp` 用于什么类型的数据?
- node.js - 如何在一定时间后触发 throw 指令?
- python - 类属性
- webassembly - 是否可以使用 emscripten 为 webassembly 编译 x264?