JsonPath 中的条件

Criteria inside JsonPath

我正在尝试按类型过滤 jsonPath。提取整数

我预计这将 return 什么都没有,因为 'xx' 不是整数:

JsonPath.read("{'status': 'xx'}", "$.status", Criteria.where(".status").is(Integer.class));

类似这样

JsonPath.read("{'status': 'xx'}", "$.status", Criteria.where(".status").eq(200));

两种情况 returns String = "xx" 我希望它 return 为 null 或空字符串,因为它与数字 200 不匹配。

您应该使用 $[?].status 作为条件的 json 路径。 另外 where("field").is("value") 接受值但不接受 class。 您可以查看 Criteria.eq(...)

的实现
public Criteria eq(Object o) {
    return is(o);
}

代码如下:

public static void main(String[] args) {
    Criteria criteria = Criteria.where("status").gt(10);
    Object read = JsonPath.read("{'status': 18}", "$[?].status", criteria);
    System.out.println("First: " + read);
    read = JsonPath.read("{'status': 2}", "$[?].status", criteria);
    System.out.println("Second: " + read);

    criteria = Criteria.where("status").is("value");
    read = JsonPath.read("{'status': 'value'}", "$[?].status", criteria);
    System.out.println("Third: " + read);

    criteria = Criteria.where("status").is("value");
    read = JsonPath.read("{'status': 'NON'}", "$[?].status", criteria);
    System.out.println("Third: " + read);
}

输出:

First: [18]
Second: []
Third: ["value"]
Third: []

正确@i.bondarenko,我只是简单地添加 - 对于搜索状态值是否为整数的第一次检查 - he/she 应该使用模式传递给过滤器,例如

Pattern numberPattern = Pattern.compile("\d+");
Filter filter = filter(where("status").regex(numberPattern));
Object test = JsonPath.read("{\"status\": \"xx\"}", "$[?].status", filter);

System.out.println("Test : " + test);

那将打印 Test : []

已更新

它确实是一个 JSON 数组,因此,您已经在该数组中拥有整个 JSON 的整数(如果它们存在)。例如,

Pattern numberPattern = Pattern.compile("\d+");
Filter filter = filter(where("status").regex(numberPattern));
net.minidev.json.JSONArray test = JsonPath.read("{\"status\": 300}", "$[?].status", filter);

if (!test.isEmpty()) {
    for (Object object : test) {
         System.out.println("Test : " + object.toString());
    }
}

因此,无需添加 try-catch,只需检查 JSON 数组结果

的大小就足够了