使用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
相关产品推荐
相关产品推荐

