如何使用Json.NET反序列化二维类数组JSON为C#类并读取属性值
C# 使用Newtonsoft.Json反序列化指定结构JSON的方法
你定义的类结构完全匹配目标JSON结构,读取失败通常是反序列化目标类型指定错误、属性访问层级不对导致的,可按以下步骤操作:
1. 正确执行反序列化
你定义的Rootobject是嵌套在APIDistance类内部的嵌套类,反序列化时需要明确指定目标类型为APIDistance.Rootobject,示例代码如下:
// 引入必要命名空间 using Newtonsoft.Json; using System.Linq; // jsonStr为你从URL获取到的JSON字符串 string jsonStr = "你的JSON字符串内容"; APIDistance.Rootobject deserializeResult = JsonConvert.DeserializeObject<APIDistance.Rootobject>(jsonStr);
注意:不要把
APIDistance作为反序列化的目标类型,该类只是所有实体类的容器,没有对应JSON的任何属性。
2. 层级读取属性值
JSON结构是多层嵌套的,读取属性时需要按照层级逐层访问,同时建议添加空值判断避免空引用异常:
if (deserializeResult != null && deserializeResult.status == "OK") { // 读取出发地、目的地地址 string originAddress = deserializeResult.origin_addresses?.FirstOrDefault() ?? "无出发地信息"; string destAddress = deserializeResult.destination_addresses?.FirstOrDefault() ?? "无目的地信息"; // 读取距离、耗时信息 var firstRow = deserializeResult.rows?.FirstOrDefault(); var firstElement = firstRow?.elements?.FirstOrDefault(); if (firstElement != null && firstElement.status == "OK") { // 距离文本(如220 ft) string distanceText = firstElement.distance?.text; // 距离数值(单位:米) int distanceValue = firstElement.distance?.value ?? 0; // 耗时文本(如1 min) string durationText = firstElement.duration?.text; // 耗时数值(单位:秒) int durationValue = firstElement.duration?.value ?? 0; // 此处可正常使用以上读取到的所有值 } }
可选优化
如果不想每次访问都加APIDistance.前缀,可以把Rootobject、Row、Element等类从APIDistance类中移出,改为和APIDistance同级的公共类即可。
内容的提问来源于stack exchange,提问作者DarrenB
相关产品推荐
相关产品推荐

