You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行时反序列化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:04:53