c# - 如何在 C# 中处理半结构化 JSON 数据
问题描述
在 C# 中处理半结构化 JSON 数据的最佳方法是什么?如果您有嵌套对象,最终其中一个会返回 null,您将如何处理?您将如何处理意外的嵌套空对象?编写多个 if 语句只是为了检查它是否为空是很麻烦的,因为嵌套对象可以是“N”个数量。使用 3rd 方 API,您不能总是期望它们返回结构化数据集。
例子:
[{
"ID": 0
, "WeatherName": "Rain"
, "Location": "San Francisco"
, "Details": null
},{
"ID": 1
, "WeatherName": "Snow"
, "Location": "New York"
, "Details": {
"Population": 1234567
, "Traffic": null
}
},{
"ID": 2
, "WeatherName": "Fire"
, "Location": "Sacramento"
, "Details": {
"Population": 1234567
,"Traffic": {
"Accidents": 10
,"Death": 10
}
}
}]
在这种情况下,我必须编写一个 if 语句来检查父对象是否为空,然后编写另一个 if 语句来检查子对象是否为空,然后再编写另一个 if 语句来检查另一个子语句是否为空。如您所见,编写多个 if 语句来检查 null 可能会很痛苦。
解决方案
对我来说,这看起来不像是非结构化数据集。某些属性为 null 的可能性是可控的(而且太常见),而不是在同一个数组中拥有不同类型的对象而没有任何重叠的属性!
尝试像这样建模您的响应(使用此工具完成):
public class Traffic {
public int Accidents { get; set; }
public int Death { get; set; }
}
public class Details {
public int Population { get; set; }
public Traffic Traffic { get; set; }
}
public class Response {
public int ID { get; set; }
public string WeatherName { get; set; }
public string Location { get; set; }
public Details Details { get; set; }
}
然后,解析(使用 Newtonsoft.JSON)并以安全的方式访问一些可能为空的属性(为了更安全而编辑,赞 @mjwills):
var response = JsonConvert.DeserializeObject<Response[]>(myJsonString);
int? maybePopulation = response.FirstOrDefault()?.Details?.Population; // either int, or null
换句话说,要处理必须检查 null 并避免编写 null 检查,请使用null-conditional operator。
推荐阅读
- c - 为什么我在编译时收到“警告:函数返回局部变量 [-Wreturn-local-addr] 的地址”?
- javascript - 如果 esModuleInterop 是 true 配置 TypeScript 转换,我是否需要明确的 allowSyntheticDefaultImports?
- druid - 如何在使用 imply 时限制 druid 生成的日志文件的大小?
- python - Python:列表理解以访问多个列表
- html - 让 div 的背景延伸到页面的两侧
- emacs - authinfo.gpg 中的 Emacs “Tramp” sudo 设置:特定于机器的 sudo 认证
- javascript - Javascript 工作,但不在 Vue 组件中
- facebook-graph-api - Facebook 支付 API 仅在 created_time 不返回支付信息
- python - Python:在同一个包中的两个不同文件中导入标准模块?
- python - 如何在cmd中将python添加为命令?