【问题标题】:Get values by key from JSON Multi-dimensional Array从 JSON 多维数组中按键获取值
【发布时间】:2022-07-07 21:56:06
【问题描述】:

JSON:

[{"id":141741,"name":"Group","nodeTypeId":3,"deleted":false,"hasNodeAccesses":false,"children": [{"id":141742,"name":"Division","nodeTypeId":14,"deleted":false,"hasNodeAccesses":false,"children":[{"id":141743,"name":"Site 1","nodeTypeId":4,"deleted":false,"hasNodeAccesses":false,"children":[{"id":141746,"name":"Converting","nodeTypeId":5,"deleted":false,"hasNodeAccesses":false,"children":[]}]},{"id":141744,"name":"Site 2","nodeTypeId":4,"deleted":false,"hasNodeAccesses":false,"children":[{"id":141748,"name":"Converting","nodeTypeId":5,"deleted":false,"hasNodeAccesses":false,"children":[]}]},{"id":141745,"name":"Site 3","nodeTypeId":4,"deleted":false,"hasNodeAccesses":false,"children":[{"id":141750,"name":"Converting","nodeTypeId":5,"deleted":false,"hasNodeAccesses":false,"children":[]}]},{"id":141752,"name":"ML1","nodeTypeId":12,"deleted":false,"hasNodeAccesses":false,"children":[{"id":141755,"nodeTypeId":4,"deleted":false,"hasNodeAccesses":false,"children":[]}]},{"id":141753,"name":"ML2","nodeTypeId":12,"deleted":false,"hasNodeAccesses":false,"children":[{"id":141756,"nodeTypeId":4,"deleted":false,"hasNodeAccesses":false,"children":[]}]},{"id":141754,"name":"ML3","nodeTypeId":12,"deleted":false,"hasNodeAccesses":false,"children":[{"id":141757,"nodeTypeId":4,"deleted":false,"hasNodeAccesses":false,"children":[]}]}]}]}]

代码:

public List<String> getCapexStrategyNodeNames() {
        JsonNode capexStrategyNodeList = client.getCapexStrategyNodes();
        JSONArray nodes = capexStrategyNodeList.getArray();
        List<JSONObject> nodeList = nodes.toList();
        return retrieveValues(nodeList, "name");
    }

private List<String> retrieveValues(List<JSONObject> list, String key) {
    return list.stream()
            .map(val -> val.getString(key))
            .collect(Collectors.toList());
}

输出:

[Group]  

我只检索第一个值
如何从嵌套的 JSON 数组中检索所有名称值?

提前致谢!

【问题讨论】:

    标签: java json rest multidimensional-array


    【解决方案1】:

    使用您当前的实现,您将获得 JsonNode 对象并且您正在读取它的 name 属性,但您没有读取该属性,因为它是 chlildren(内部对象)。

    您必须递归查询所有嵌套对象并获取字段name 的值。

    在我看来,最简单的方法是使用JsonPath

    在 pom.xml 文件中添加这个依赖:

    <dependency>
        <groupId>com.jayway.jsonpath</groupId>
        <artifactId>json-path</artifactId>
        <version>2.4.0</version>
    </dependency>
    

    这里是代码 sn-p:

    public static void main(String[] args) throws JsonProcessingException {
            String json = "[{\"id\":141741,\"name\":\"Group\",\"nodeTypeId\":3,\"deleted\":false,\"hasNodeAccesses\":false,\"children\": [{\"id\":141742,\"name\":\"Division\",\"nodeTypeId\":14,\"deleted\":false,\"hasNodeAccesses\":false,\"children\":[{\"id\":141743,\"name\":\"Site 1\",\"nodeTypeId\":4,\"deleted\":false,\"hasNodeAccesses\":false,\"children\":[{\"id\":141746,\"name\":\"Converting\",\"nodeTypeId\":5,\"deleted\":false,\"hasNodeAccesses\":false,\"children\":[]}]},{\"id\":141744,\"name\":\"Site 2\",\"nodeTypeId\":4,\"deleted\":false,\"hasNodeAccesses\":false,\"children\":[{\"id\":141748,\"name\":\"Converting\",\"nodeTypeId\":5,\"deleted\":false,\"hasNodeAccesses\":false,\"children\":[]}]},{\"id\":141745,\"name\":\"Site 3\",\"nodeTypeId\":4,\"deleted\":false,\"hasNodeAccesses\":false,\"children\":[{\"id\":141750,\"name\":\"Converting\",\"nodeTypeId\":5,\"deleted\":false,\"hasNodeAccesses\":false,\"children\":[]}]},{\"id\":141752,\"name\":\"ML1\",\"nodeTypeId\":12,\"deleted\":false,\"hasNodeAccesses\":false,\"children\":[{\"id\":141755,\"nodeTypeId\":4,\"deleted\":false,\"hasNodeAccesses\":false,\"children\":[]}]},{\"id\":141753,\"name\":\"ML2\",\"nodeTypeId\":12,\"deleted\":false,\"hasNodeAccesses\":false,\"children\":[{\"id\":141756,\"nodeTypeId\":4,\"deleted\":false,\"hasNodeAccesses\":false,\"children\":[]}]},{\"id\":141754,\"name\":\"ML3\",\"nodeTypeId\":12,\"deleted\":false,\"hasNodeAccesses\":false,\"children\":[{\"id\":141757,\"nodeTypeId\":4,\"deleted\":false,\"hasNodeAccesses\":false,\"children\":[]}]}]}]}]";
            List<Object> expensive = JsonPath.parse(json)
                    .read("$..name"); //Recursive descent: Searches for the/specified property name recursively and returns an array of all values with this property name. Always returns a list, even if just one property is found.
    
            System.out.println(expensive);
    
        }
    

    如果您运行此代码,您将看到如下输出:

    ["Group","Division","Site 1","Converting","Site 2","Converting","Site 3","Converting","ML1","ML2","ML3"]
    

    【讨论】:

      【解决方案2】:

      您的 json 只有一个对象,因此您的输出只有一项是正确的。

      这是第一级数组中唯一存在的对象

      [{
          "id": 141741,
          "name": "Group",
          "nodeTypeId": 3,
          "deleted": false,
          "hasNodeAccesses": false,
          "children": [...]
      }]
      

      所以你的代码应该返回 ["Group"] 并且它是正确的。 可能您需要浏览孩子,并可能递归地浏览任何嵌套的孩子。在这种情况下,您需要更改算法

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-09
        • 2018-11-21
        • 1970-01-01
        • 1970-01-01
        • 2019-09-17
        • 2013-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多