如何查找JSON中存在的节点

如何查找JSON中存在的节点,json,jsonpath,Json,Jsonpath,我有以下几个问题 {"subscription": { "callbackReference": "xyz" , "criteria": "Vote", "destinationAddress": "3456" , "notificationFormat" : "JSON" } } 我想使用JSONPath表达式检查“notificationFormat”元素是否存在。我可以使用下面的JSONPath表达式获得上面元素的值 $.subscription.notification

我有以下几个问题

{"subscription": 
 {
 "callbackReference": "xyz" ,
 "criteria": "Vote",
 "destinationAddress": "3456" ,
  "notificationFormat" : "JSON"
 }
}
我想使用JSONPath表达式检查“notificationFormat”元素是否存在。我可以使用下面的JSONPath表达式获得上面元素的值

$.subscription.notificationFormat

我可以使用类似的表达式返回布尔值来检查元素是否存在吗?

如果我理解你的问题,这里有一个正确的答案

这将检查json中是否存在notificationFormat

$.subscription[?(@.notificationFormat)]
如果notificationFormat存在,将获得所有destinationAddress

$.subscription[?(@.notificationFormat)].destinationAddress

如果您使用Jayway的JSONPath-the-Java实现,并提前对JSON进行一次解析,以提高多次读取的效率,那么有一种比使用JSONPath过滤器表达式更清晰的方法来检查是否存在可选JSON属性。使用已解析JSON的ReadContext对象表示将父JSON对象作为Java HashMap返回,然后检查是否存在具有属性名称的映射项。使用问题中的JSON,检查可选“notificationFormat”属性是否存在的(Java)代码将是-


这不是有效的JSON。检查一下好的。对于缺少的属性,此JSONPath表达式返回什么?对于
false
属性,它返回什么?空字符串属性是什么?也许这就足以说明该属性是否存在。如果添加无异常配置,则将导致空值。上述解决方案的关键部分是JSONPath筛选器表达式语法“[?@.]”。您可以使用在线JSONPath计算器来测试表达式,例如由位于的Jayway JSONPath项目提供的计算器。如果您使用的是Jayway的JSONPath Java实现——JSONPath库——那么还有另一种解决方案。请参阅下面的答案。如果是嵌套JSON数组,该怎么办?
Object result = JsonPath.parse("{}", com.jayway.jsonpath.Configuration.defaultConfiguration().addOptions(Option.SUPPRESS_EXCEPTIONS)).read("$.plugin.writer.mysqlwriter.path");
System.out.println("json exist");
ReadContext parsedJson = JsonPath.parse(jsonString);
HashMap subscription = parsedJson.read("$.subscription"); 
if (subscription.containsKey("notificationFormat")) {  
  ... 
}