代码之家  ›  专栏  ›  技术社区  ›  Hamza Amami

jsonpath中没有任何原因需要的字符

  •  -1
  • Hamza Amami  · 技术社区  · 6 年前

    假设我有这个json:

    {
       "response" : {
          "code" : "XXX",
          "label" : "Lorem Ipsum",
          "items" : [
             {
                "code" : "200",
                "label" : "200 !!!"
             },
             {
                "code" : "300",
                "label" : "300 !!!!!"
             },
             {
                "code" : "500",
                "label" : "+500 !!!!!"
             }]
       }
    }
    

    我想在 code =500(例如)在Java中。

    我在用 jayWay 库和此jsonpath:

    "$.response.items[?(@.code='500')].label"
    

    解析时出现此错误: Expected character: )

    Java代码:

    public static String getElementValueByJsonPath(String jsonContent, String jsonPath) {
    
            if (checkJsonValidity(jsonContent)) {
                String returnedValue ="";
                Configuration config = Configuration.defaultConfiguration().addOptions(Option.SUPPRESS_EXCEPTIONS);
                try {
                    returnedValue = ""+JsonPath.using(config).parse(jsonContent).read(jsonPath);
                } catch (Exception e) {
                System.out.println(e.getMessage());
                }
    
                return returnedValue;
    
            } 
            return null;
    

    任何人都知道我为什么会犯这个错误,我可以用另一个库或方法绕过它吗?

    谢谢

    1 回复  |  直到 6 年前
        1
  •  2
  •   user177800    6 年前

    您得到错误的原因非常合理,那不是一个有效的jsonpath查询。

    如果你去 https://jsonpath.herokuapp.com/ (它使用jayway)并输入相同的数据和路径,您将看到这不是jayway的有效jsonpath查询,或者其他两个实现,唯一没有完全失败的实现不会返回您期望的结果。我想你应该回去重新读一遍 jsonpath documentation 因为这个语法显然是无效的。

    正确的语法是 $.response.items[?(@.code=='500')].label 作为 documentation clearly states .

    我不会依赖不正确语法的实现。