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 数组结果
的大小就足够了
我正在尝试按类型过滤 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 数组结果