如何使用Jackson解析嵌套的JSON(无论是递归还是迭代)?

时间:2015-04-04 01:43:46

标签: java json jackson

我有一个示例JSON有效负载,如下所示:

 {"timestamp": 1427394360, "device": {"user-agent": "Mac OS 10.10.2 2.6 GHz Intel Core i7"}}

我解析它并使用它获取键/值对:

 Iterator<Map.Entry<String,JsonNode>> fieldsIterator = rootNode.fields();

 while (fieldsIterator.hasNext()) {
    Map.Entry<String,JsonNode> field = fieldsIterator.next();
    key = field.getKey();
    value = field.getValue();
    System.out.println("Key: " + key);
    System.out.println("Value: " + value);
 }

输出:

Key: timestamp
Value: 1427394360

Key: device
Value: {"user-agent": "Mac OS 10.10.2 2.6 GHz Intel Core i7"}

如何设置它以便我可以解析设备密钥中的键/值对变为:

Key: "user-agent"
Value: "Mac OS 10.10.2 2.6 GHz Intel Core i7"

而且,可能有JSON内部有更多嵌套的JSON ...... 这意味着某些JSON可能没有嵌套的JSON,而某些JSON可能有多个......

有没有办法使用Jackson以递归方式解析JSON有效负载中的所有键/值对?

感谢您抽出宝贵时间阅读此内容......

3 个答案:

答案 0 :(得分:5)

如果值为容器(例如:数组或对象),则可以将代码放在方法中并进行递归调用。

例如:

public static void main(String[] args) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    final JsonNode rootNode = mapper.readTree(" {\"timestamp\": 1427394360, \"device\": {\"user-agent\": \"Mac OS 10.10.2 2.6 GHz Intel Core i7\"}}");
    print(rootNode);
}

private static void print(final JsonNode node) throws IOException {
    Iterator<Map.Entry<String, JsonNode>> fieldsIterator = node.getFields();

    while (fieldsIterator.hasNext()) {
        Map.Entry<String, JsonNode> field = fieldsIterator.next();
        final String key = field.getKey();
        System.out.println("Key: " + key);
        final JsonNode value = field.getValue();
        if (value.isContainerNode()) {
            print(value); // RECURSIVE CALL
        } else {
            System.out.println("Value: " + value);
        }
    }
}

答案 1 :(得分:1)

下面的代码将帮助您使用Jackson库解析和获取所需的值。

公共类GetJsonKeyValueUsingRecursion {

        static String value;

        public static void main(String[] args) throws JsonProcessingException, IOException {

                    JsonNode rootPage = new ObjectMapper()
                                            .readTree(new File("C:/employee.json"));
                    // System.out.println(rootPage);


                    JsonNode std = rootPage.path("Student");
                    System.out.println(std);
                    //Call recursive json parser with node name and key name whose values is required
                    String value = parseJsonRecursively(std, "SSC");

                    System.out.println("Searched value: " + value);
        }
        static boolean flag =false;
        private static String parseJsonRecursively(JsonNode rootNode, String expectedKey) {

                    value = null;
                    try {

                                if (rootNode.isArray() && rootNode.isContainerNode()) {
                                            System.out.println("In array Root node is: " + rootNode);

                                            for (JsonNode objNode : rootNode) {

                                                        if(flag)
                                                        {
                                                                    break;
                                                        }
                                                        else if (objNode.isValueNode()) {

                                                        } else {

                                                                    parseJsonRecursively(objNode, expectedKey);
                                                        }
                                            }

                                } else if (rootNode.isValueNode()) {
                                            value = rootNode.asText();
                                            return value;
                                } else if (rootNode.isContainerNode()) {

                                            Iterator<String> subItemItrator = rootNode.fieldNames();

                                            while (subItemItrator.hasNext() && !flag) {

                                                        String targetKey = subItemItrator.next();

                                                        System.out.println("Target Key: " + targetKey);

                                                       if (targetKey.equals(expectedKey)) {
                                                                    value = rootNode.path(targetKey).asText();

                                                                    System.out.println("Matched :-----> " + targetKey + " = " + expectedKey + " Value: " + value);
                                                                    flag =true;
                                                                    return value;


                                                        } else if (!rootNode.path(targetKey).isValueNode() && flag == false) {
                                                                    parseJsonRecursively(rootNode.path(targetKey), expectedKey);

                                                        }

                                            }

                                }

                    } catch (Exception e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                    }
                    return value;

        }

}

答案 2 :(得分:0)

如果我是此代码的开发人员,我宁愿使用现有的JSON库(例如Jackson或GSON)来实现此目的。

以下是解析对象列表的JSON表示的示例之一。 网址:http://www.studytrails.com/java/json/java-jackson-Serialization-list.jsp