当前位置: 首页 > 知识库问答 >
问题:

Java:查找JSON对象中每个属性的确切路径

薛承志
2023-03-14

嗨,我在Java用jackson写了一个JSON树解析器。现在我想在JSON中找到每个属性的路径。JSON示例:

{"product":{
    "name":"Flipper",
    "industry":"Real Estate",
    "description":"Discovers correlations and trending criteria.",
    "someArray": ["bla1", "bla2", "bla3"],
    "productspecs":{"spec1":"somespec1",
                      "spec2":"someotherspec2"},
    "arrayOfObjects":[{"test1": "a1", "test2":"a2"},
                        {"Hi1": "b1", "Hi2":"b2"}]
},
"name":"Peter",
"anotherArray":["la1", "la2"]}

此JSON中的路径示例如下:

/product/industry

它具有价值

"Real Estate"

我编写的解析器获取直接包含一个值(而不是另一个JSON对象)的所有属性。代码如下:

public void processJson(String jsonStr) {
    ObjectMapper objectMapper = new ObjectMapper();

    try {
        JsonNode node = objectMapper.readTree(jsonStr);  
        first = true;
        processNode(node);

    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

private void processNode(JsonNode n) {  
    if (n.isContainerNode()) {
        if (n.isArray()){
            Iterator<JsonNode> itt = n.iterator();
            while (itt.hasNext()) {
                JsonNode innerNode = itt.next();
                processNode(innerNode);
            }
        }
        else {
            Iterator<Map.Entry<String,JsonNode>> fieldsIterator = n.fields();
            Map.Entry<String,JsonNode> field;               
            while (fieldsIterator.hasNext()){
                field = fieldsIterator.next();
                this.lastKey = field.getKey();      
                location += "/" + this.lastKey;
                processNode(field.getValue());
            }
        }       
    }
    else if (n.isNull()) {
        propertyCount++;
        System.out.println("Key: " + this.lastKey + " Value: " + n);
    } else {
        propertyCount++;
        location = location.substring(0,location.lastIndexOf("/"));

        System.out.println("Key: " + this.lastKey  + " Value: " + n.asText());          
    }
}

代码的运行方式如下:

processJson(ExampleJSON);

结果是:

Key: name Value: Flipper
Key: industry Value: Real Estate
Key: description Value: Discovers correlations and trending criteria.
Key: someArray Value: bla1
Key: someArray Value: bla2
Key: someArray Value: bla3
Key: spec1 Value: somespec1
Key: spec2 Value: someotherspec2
Key: test1 Value: a1
Key: test2 Value: a2
Key: Hi1 Value: b1
Key: Hi2 Value: b2
Key: name Value: Peter
Key: anotherArray Value: la1
Key: anotherArray Value: la2

现在,对于其中的每一个,我都希望获得JSON中的路径。所以:

Key: name Value: Flipper Path: product/name
Key: industry Value: Real Estate Path: product/industry
Key: description Value: Discovers correlations and trending criteria. Path: product/description
Key: someArray Value: bla1 Path: product/someArray
Key: someArray Value: bla2 Path: product/someArray
Key: someArray Value: bla3 Path: product/someArray

等等....

共有1个答案

滑令
2023-03-14

我的方法是在递归方法processNode中添加另一个参数,它将表示当前路径。

private void processNode(JsonNode n, String currentPath)

每次深入递归时,调用带有currentPath的方法,并附加要进入的键。

while (fieldsIterator.hasNext()) {
    field = fieldsIterator.next();
    this.lastKey = field.getKey();
    location += "/" + this.lastKey;
    processNode(field.getValue(), currentPath + "/" + this.lastKey);
}       

因此,在打印部分,您需要:

propertyCount++;
location = location.substring(0, location.lastIndexOf("/"));

System.out.println("Key: " + this.lastKey + " Value: " + n.asText() + " Path: " + currentPath);
 类似资料:
  • 给定以下JSON结构,我希望能够在数组,其中包含具有特定。 假设我正在寻找带有的条目——在这种情况下,我想提取完整的对象: 我尝试嵌套过滤器,但没有成功: 我可以很容易地通过,但是我想实际上检索它的父对象!这在JSONPath中可能吗?

  • 我已经制作了一个程序来使用第三部分API:我有一个名为:NewsService的服务 我有我的控制器 一切都是好的,然而,当我运行我的测试(我不能改变它由内部审计控制)这里我的测试。 接下来,在运行程序时,我遇到了程序中检查验证Exist()的问题。你能帮帮我吗?下面的日志之后运行测试。 null ` 使用Postman http://localhost:8080/api/news/topstor

  • 问题内容: 是否有可能从具有特定属性的数组中获取对象?还是我需要遍历数组中的所有对象并检查属性是否是我正在寻找的特定对象? 编辑:谢谢你给我正确的方向,但我有一个转换此问题。 //再编辑一次:好的,如果只有一个特定的结果?这也是可行的方法吗? 问题答案: //这不起作用-NSArray不是Images的子类型-那么如果只有1种可能的结果怎么办? 您无法在编译时证明数组上只有一个可能的结果。您实际要

  • 我发现自己经常遇到这种模式。我有一个从api中返回的对象数组,我只需要操作所有对象中的一个属性。 有没有办法使用ES6/Babel或Typescript让该模式更具声明性? 寻找一些巧妙的破坏技巧或类似的东西。

  • 我怎么能找到一个对象,,在

  • 问题内容: 该数组如下所示: 我有一个名为的整数变量。 如何选择具有对象的数组条目,其中的属性具有值? 问题答案: 您可以迭代数组,搜索特定记录(一次只能搜索一次),也可以使用另一个关联数组来构建哈希图。 对于前者,像这样