3 回答
TA贡献2019条经验 获得超9个赞
JsonPath 库有一个选项,它返回整个匹配的路径而不是值。因此,您可以执行以下操作:
Configuration conf = Configuration.builder().options(Option.AS_PATH_LIST).build();
List<String> pathList = JsonPath.using(conf).parse(payload).read("$..ppsNo");
/* Returns :
* [
* "$['contractor']['ppsNo']",
* "$['fullTimeStaff']['ppsNo']"
* ]
*/
您只需将结果解析为正确的类型,然后删除最后一个元素即可获得直接父级。
Pattern pattern = Pattern.compile("(?<!\\$\\[)(\\w+)(?!\\])");
pathList = pathList.stream().map(path -> {
Matcher m = pattern.matcher(path.toString());
return m.find() ? m.group(0) : null;
}).collect(Collectors.toList());
System.out.println(pathList); // [contractor, fullTimeStaff]
这是官方Jayway JsonPath Maven 存储库的链接。
TA贡献1794条经验 获得超7个赞
我没有花很多时间来编写代码。
您正在寻找的表达式Regex
是\{\n "ppsNo": "\w+"\n }
(您使用链接https://regex101.com对其进行测试)。你应该做的是当你遇到这个表达式时开始倒退并阅读“”中的第一个单词。我希望它对你有帮助
TA贡献1848条经验 获得超6个赞
我们可以在JsonNode.fields方法的帮助下使用递归来搜索目标父节点,如下例所示。
public class GetParentByChildName {
public static void main(String[] args) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
String payload = "{ \n"
+ " \"id\": \"3334343\", \n"
+ " \"contractor\": { \n"
+ " \"ppsNo\": \"123334\" \n"
+ " }, \n"
+ " \"arr\": [ \n"
+ " { \n"
+ " \"contractor2\": { \n"
+ " \"ppsNo\": \"123334\" \n"
+ " } \n"
+ " }, \n"
+ " [ \n"
+ " { \n"
+ " \"contractor3\": { \n"
+ " \"ppsNo\": \"123334\" \n"
+ " } \n"
+ " } \n"
+ " ] \n"
+ " ], \n"
+ " \"fullTimeStaff\":{ \n"
+ " \"ppsNo\": \"123334\" \n"
+ " } \n"
+ "} ";
JsonNode root = objectMapper.readTree(payload);
List<String> fieldNames = new ArrayList<String>();
getParentName(root, "ppsNo", fieldNames);
System.out.println(fieldNames);
}
private static void getParentName(JsonNode node, String targetChildName, List<String> fieldNames) {
if (node.getNodeType() == JsonNodeType.ARRAY) {
node.elements().forEachRemaining(x -> getParentName(x, targetChildName, fieldNames));
return;
}
if (node.getNodeType() != JsonNodeType.OBJECT) {
return;
}
node.fields().forEachRemaining(x -> {
Iterator<String> iter = x.getValue().fieldNames();
while (iter.hasNext()) {
String fieldName = iter.next();
if (fieldName.equals(targetChildName)) {
fieldNames.add(x.getKey());
}
}
getParentName(x.getValue(), targetChildName, fieldNames);
});
}
}
添加回答
举报