运行时反序列化JSON赋值报错:JArray无x定义
问题解决:反序列化JSON时访问数组元素报错
问题场景
使用dynamic Json = JsonConvert.DeserializeObject(result);反序列化JSON后,调试器显示JSON结构为:
{ "geo": [ { "x": 16324865.646724658, "y": -4967300.1743641077 } ] }
执行以下赋值代码时触发错误:
double x1 = 0; double y1 = 0; x1 = Json.geo.x.Value(); y1 = Json.geo.y.Value();
错误信息:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: ''Newtonsoft.Json.Linq.JArray' does not contain a definition for 'x''
错误原因
JSON中的geo是数组类型(用[]包裹),反序列化后Json.geo对应的是JArray对象,而非单个对象。直接通过Json.geo.x访问会报错,因为数组本身没有x属性,x属于数组内的第一个元素对象。
解决方法
方法1:直接访问数组元素
通过索引获取数组中的第一个对象,再访问其x和y属性:
double x1 = 0; double y1 = 0; // 取geo数组的第一个元素 var geoItem = Json.geo[0]; x1 = geoItem.x.Value; y1 = geoItem.y.Value;
或者简化为一行:
x1 = Json.geo[0].x.Value; y1 = Json.geo[0].y.Value;
方法2:使用强类型序列化(推荐)
定义与JSON结构匹配的类,避免dynamic的运行时绑定错误:
// 定义对应的数据类 public class GeoItem { public double x { get; set; } public double y { get; set; } } public class RootObject { public List<GeoItem> geo { get; set; } } // 反序列化为强类型对象 var root = JsonConvert.DeserializeObject<RootObject>(result); double x1 = root.geo[0].x; double y1 = root.geo[0].y;
这种方式能在编译期发现错误,比dynamic更安全可靠。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

