java.lang.NumberFormatException:对于尝试使用包含数字的路径读取Json时的输入字符串

时间:2018-01-19 15:25:13

标签: java json jsonpath

我试图像这样返回一个JSON数组:

jsarr = new JSONArray(JSON.read(genericPathComp).toString());

其中genericPathComp是已编译的JSON路径。

这种方法工作正常,但是当我的JSON路径包含一个数字时,会抛出以下异常:

java.lang.NumberFormatException: For input string: "ustomerAccountBalance,billingAccount[(-1"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:492)
    at java.lang.Integer.parseInt(Integer.java:527)
    at com.jayway.jsonpath.internal.filter.ArrayIndexFilter.filter(ArrayIndexFilter.java:75)
    at com.jayway.jsonpath.internal.filter.PathTokenFilter.filter(PathTokenFilter.java:50)
    at com.jayway.jsonpath.JsonPath.read(JsonPath.java:255)
    at com.jayway.jsonpath.internal.JsonReader.read(JsonReader.java:103)
    at dataAnalytics.ValidateAttributes.responseParser(ValidateAttributes.java:174)
    at dataGeneration.Main.main(Main.java:76)

抛出此异常的JSON路径是: $ .parts [customerAccountBalance,billingAccount [-1:]]

我不明白它解析int的原因,我错过了什么?

编辑:我使用的是jayway解析器,变量JSON是一个ReadContext变量。所以它是有效JSON的句柄。到目前为止,此代码适用于每个没有数字的JSON路径。所以例如$ .parts.billingAccount和$ .name.date都可以。

原始JSON看起来像这样:

[
  {
    "Name": [
      {
        "value": "John"
      }
    ],
    "parts": {
      "customerAccountBalance": [
        {
          "amount": "1"
        }
      ],
      "billingAccount": [
        {
          "type": "example"
        },
        {
          "date": "also example"
        }
      ]
    }
  }
]

我想返回一个由最后一个结算帐户数组和所有客户帐户余额组成的数组。

1 个答案:

答案 0 :(得分:1)

此例外......

java.lang.NumberFormatException: For input string: "ustomerAccountBalance,billingAccount[(-1"
at 

...正在发生,因为Jayway期望数字(0 - 9)遵循开头的方括号。查看Jayway docs它允许开放方括号后跟'(对于括号标记的子项)或?(对于过滤器),除此之外,它需要一个开放的正方形括号后跟一个数字。

因此,您问题中提供的json路径无效。我怀疑您正在尝试阅读billingAccount中的最后一个parts.customerAccountBalance。如果是这样,请继续阅读......

鉴于此JSON:

{
  "parts": {
    "customerAccountBalance": {
      "billingAccount": [
        1,
        2,
        3
      ]
    }
  }
}

此json路径:$.parts.customerAccountBalance.billingAccount[-1:]将返回:

[
   3
]

您可以使用在线Jayway Evaluator

自行尝试

更新重新:

  

我想返回一个由最后一个结算帐户数组和所有客户帐户余额组成的数组。

鉴于此JSON:

{
  "Name": [
    {
      "value": "John"
    }
  ],
  "parts": {
    "customerAccountBalance": [
      {
        "amount": "1"
      }
    ]
  },
  "billingAccount": [
    {
      "type": "example"
    },
    {
      "date": "also example"
    }
  ]
}

这涉及两个读取调用:

  • "最后一个结算帐户数组":$.billingAccount[-1:]
  • "所有客户帐户余额":$.parts.customerAccountBalance