java - 使用 jackson 获取值的 json 路径

标签 java json jackson

我正在尝试使用 jackson 从 json 字符串中检索值的 json 路径。由于我在 jackson 中找不到任何函数给我这个结果,所以我想创建自己的函数。

所以我做了这个函数:

public static String getJsonPath(Map.Entry<String, JsonNode> jsonNode, String valueSearched) {
    String res = "";
    String key = jsonNode.getKey();
    JsonNode value = jsonNode.getValue();
    if (value.isValueNode() && value.equals(valueSearched)) { // Here the value change to a ValueNode and the key weirdly equals to "".
        return res + key;
    } else {
        if (value.isContainerNode()) {
            if (value.isObject()) {
                Iterator<Map.Entry<String, JsonNode>> elements = value.fields();
                while (elements.hasNext()) {
                    Map.Entry<String, JsonNode> element = elements.next();
                    res += "." + element.getKey() + generateJsonPathArgumentFromJson(element, valueSearched);
                }
            } else {
                int i = 0;
                ArrayNode arrayNode = (ArrayNode) jsonNode;
                Iterator<Map.Entry<String,JsonNode>> elements = arrayNode.fields();
                while (elements.hasNext()) {
                    Map.Entry<String, JsonNode> element = elements.next();
                    i++;
                    res += "(" + i + ")" + generateJsonPathArgumentFromJson(element, valueSearched);
                }
            }
        }
    }
    return "";
}

为什么在第一个 if 之后键等于 ""?或者有更好的方法为特定值构建 json 路径?

最佳答案

只需获取解决方案:

protected static String generateJsonPathArgumentFromJson(JsonNode jsonNode, String valueSearched) {
    if (jsonNode.isValueNode() && !jsonNode.asText().equals(valueSearched)) {
        return null;
    } else {
        if (jsonNode.isContainerNode()) {
            if (jsonNode.isObject()) {
                Iterator<Map.Entry<String, JsonNode>> elements = jsonNode.fields();
                while (elements.hasNext()) {
                    Map.Entry<String, JsonNode> element = elements.next();
                    String res =  generateJsonPathArgumentFromJson(element.getValue(), valueSearched);
                    if (res != null) {
                        return "." + element.getKey() + res;
                    }
                }
            } else {
                int i = 0;
                Iterator<JsonNode> elements = jsonNode.elements();
                while (elements.hasNext()) {
                    JsonNode element = elements.next();
                    String res = generateJsonPathArgumentFromJson(element, valueSearched);
                    if (res != null) {
                        return "(" + i + ")" + res;
                    }
                    i++;
                }
            }
        }
    }
    return "";
}

我确信有更好的方法,但至少它有效:)

关于java - 使用 jackson 获取值的 json 路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29961009/

相关文章:

ios - 我需要在 URL 中获取 JSON

java - 在java中将类附加到另一个主类

java - JPanel 上的组件在 setLayout(null) 时不显示

Java JIT 编译器优化 - JIT 在 volatile 变量值缓存方面是否一致?

java - 设计实现代码: static or dynamic?

php - 是否需要验证或转义 jsonp 回调字符串

mysql - 使用具有 json 数据类型的 MySQL 数据库时,如何对 Rails 中的数据库列进行排序?

exception - 尝试使用 java 将文件上传到 Amazon S3 时,jackson 出现 NoSuchMethodError。

java - 使用带有 ScalaObjectMapper 的 Jackson 模块在 Spark 1.4.0 上运行作业时出错

java - 序列化字段的属性而不是整个字段