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

使用Jayway JsonPath含数字路径读取JSON触发NumberFormatException求助

为什么会抛出NumberFormatException?

你遇到的这个异常完全是因为JSON路径的语法写错了,Jayway JsonPath解析器把你想访问的属性名当成了数组索引来处理,试图把字符串转成整数,自然就报错了。

具体看你写的路径$.parts[customerAccountBalance,billingAccount[-1:]]:

  • 在Jayway的规则里,当你在对象(比如parts)后面用[]选属性时,属性名必须用单/双引号包裹,不然解析器会默认这是数组索引或者过滤器表达式,它看到customerAccountBalance这个字符串,就尝试把它转成整数,这显然不可能,直接触发了NumberFormatException。
  • 另外你试图在同一个[]里同时选多个属性+对其中一个做切片,这种混合写法也不符合语法,导致解析器把路径截断成了"ustomerAccountBalance,billingAccount[(-1"这种奇怪的字符串,进一步加剧了错误。
正确的写法是什么?

根据你的需求——要返回包含billingAccount最后一项和customerAccountBalance全部内容的数组,分两种场景给你解决方案:

场景1:保留原数组结构

如果你想保留两个部分的原有数组形式(返回一个包含两个数组的大数组),用逗号分隔两个完整的路径就行:

$.parts.customerAccountBalance, $.parts.billingAccount[-1:]

用这个路径,解析器会先返回customerAccountBalance的全量数组,再返回billingAccount的最后一项组成的数组,最终合并成一个大数组。

场景2:返回平级的元素数组

如果你希望把所有元素放在同一个平级数组里(比如直接得到[{"amount":"1"}, {"date":"also example"}]),可以针对数组元素单独选择:

$.parts.customerAccountBalance[*], $.parts.billingAccount[-1]

这里[*]表示取customerAccountBalance里的所有对象,[-1]直接取billingAccount的最后一个对象,最终结果就是所有元素平级的数组。

修正后的代码示例

把你的代码改成这样就行:

// 选一个适合你需求的路径
String correctPath = "$.parts.customerAccountBalance[*], $.parts.billingAccount[-1]";
ReadContext JSON = ...; // 你的ReadContext实例

// 读取路径并转成JSONArray
JSONArray jsarr = new JSONArray(JSON.read(correctPath).toString());
再补几个Jayway的语法小要点
  • 对象属性访问:平时用.就够了(比如$.parts.billingAccount),如果属性名有特殊字符,就用['属性名']的形式。
  • 多属性选择:如果要同时取多个属性,用$.parts['customerAccountBalance', 'billingAccount']这样的写法,记得属性名加引号。
  • 数组操作:[-1:]是取最后一项,[0:2]是取前两项,和Python的切片语法差不多。
  • 联合路径:用逗号分隔多个独立路径,可以一次性拉取不同位置的数据,非常实用。

内容的提问来源于stack exchange,提问作者Max B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:47:51