首页 > 解决方案 > 如何比较过滤运算符中的数字字符串?

问题描述

data: [
    {
        "name": "mark",
        "age": "20"
    },
    {
        "name": "john",
        "age": "10"
    }
]

在这种情况下,如何获得大于 10 的年龄?

示例代码:

JsonPath.read(json, "$.data[?(@.age > 10)]");

标签: javajsonpathjayway

解决方案


这可以使用 Jayway 的 JsonPath 库来完成。首先,您显示的 JSON 不利于处理,{ }缺少包装。其次,如果您将数字作为字符串进行测试,Jayway 的比较运算符就可以工作(这有点奇怪,但库会以这种方式在内部进行所需的转换)。

所以,有了这个 JSON:

{
   "data":[
      {
         "name":"mark",
         "age":"20"
      },
      {
         "name":"john",
         "age":"10"
      }
   ]
}

这个过滤器:

$.data[?(@.age > '10')]

你得到了预期的结果[{"name" : "mark", "age" : "20"}]。你可以在这里在线测试。

更新

正如Parveen Verma所指出的,如果范围过滤器需要隐式类型转换,则建议的过滤器将不起作用。
Jayway 似乎只在使用相等运算符时支持隐式转换,例如$.data[?(@.age == 10)](尽管类型不同,这仍然有效)。

有一个未合并的拉取请求会添加此行为;由于代码有点落后于当前版本,因此可能需要一些工作来集成它,但如果你真的需要这个功能,它可以完成。


推荐阅读