【问题标题】:jsonpath predicate filter not working in javajsonpath谓词过滤器在java中不起作用
【发布时间】:2017-06-03 08:18:30
【问题描述】:

我正在使用 com.jayway.jsonpath 2.2.0 来查看属性是否在一系列 JSON 记录中。

这是一个使用 JSON 记录的示例

{
    "data": 
    {
        "sampleTime": "2017-06-02T11:47:37.040Z",
        "target": 
        {
            "gateway": "TEST1",
            "probe": "zeus",
            "managedEntity": "zeus",
            "type": "",
            "sampler": "HARDWARE",
            "dataview": "HARDWARE",
            "filter": 
            {
                "osType": "Linux",
                "pluginName": "HARDWARE"
            }
        },

        "name": "cpuUtilisation",
        "row": 
        {
            "Value": "50.39 % (average load)"
        }
    },

    "operation": "update"
}

所以我想匹配 if osType == 'Linux',见上面的记录

我有一些代码尝试这样做,似乎可以工作

@Test
public void test_jsonpath_filter_find_match() throws Exception {

    // load in json record from file
    String jsonString = FileUtils.readFileToString(new File("resources/geneos-raw.table-cpuutilisation.json"), "UTF-8");

    List<Map<String, Object>> match  = JsonPath.parse(jsonString).read("$..filter", Filter.filter(Criteria.where("osType").eq("Linux")));

    System.out.println("result>" + match);
}

我打印的结果似乎证明 JSON 记录与过滤器匹配

2017/06/03 09:01:27.216 [DEBUG][com.jayway.jsonpath.internal.path.CompiledPath]: Evaluating path: $..['filter']
result>[{"osType":"Linux","pluginName":"HARDWARE"}]

但是,如果我放置一个不匹配的过滤器,我仍然会得到相同的结果。

注意过滤器中的 osType == 'Windows'

@Test
public void test_jsonpath_filter_find_match() throws Exception {

    // load in json record from file
    String jsonString = FileUtils.readFileToString(new File("resources/geneos-raw.table-cpuutilisation.json"), "UTF-8");

    List<Map<String, Object>> match  = JsonPath.parse(jsonString).read("$..filter", Filter.filter(Criteria.where("osType").eq("Windows")));

    System.out.println("result>" + match);
}

结果是匹配的!

2017/06/03 09:02:06.137 [DEBUG][com.jayway.jsonpath.internal.path.CompiledPath]: Evaluating path: $..['filter']
result>[{"osType":"Linux","pluginName":"HARDWARE"}]

我相信结果应该是一个空的 List 返回。

这是一个错误,还是我的代码/思维有缺陷?

【问题讨论】:

    标签: java json filter jsonpath


    【解决方案1】:

    尝试像这样过滤:

    JsonPath.parse(jsonString).read("$..filter[?(@.osType=='Windows')]");
    JsonPath.parse(jsonString).read("$..filter[?(@.osType=='Linux')]");
    

    【讨论】:

    • 啊,是的,我应该说 - 使用 $..filter[?(@.osType=='Linux')] 确实有效。我特别想使用过滤器和标准,因为它允许使用 and 或 & not 构建更复杂的过滤。我似乎无法使用建议的语法开始工作的一件事是否定,因此过滤除 Linux 之外的所有内容
    • 嗯,实际上这适用于否定,不知道为什么我没有早点尝试! List> match = JsonPath.parse(jsonString).read("$..filter[?(@.osType!='Windows')]");我想我会按照你的建议去做,过滤器和条件似乎不起作用的原因似乎很奇怪
    • 这背后的代码来自baeldung.com/guide-to-jayway-jsonpath - 我有一张向 Baeldung 开放的票,说明为什么过滤器/标准不能正常工作。如果我得到修复,我会在这里发布。但是您的回复确实解决了问题,所以我会将其标记为已接受 - 谢谢
    • @liamj 您是否能够使用过滤器和标准获得修复?我在 2.5.0 版中仍然遇到这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    相关资源
    最近更新 更多