Как перебрать большой Json в Java, который может иметь несколько уровней объектов и массивов без использования класса pojo? - PullRequest
0 голосов
/ 06 мая 2020

Как выполнить итерацию большого Json в Java, который может иметь несколько уровней объектов и массивов без использования класса pojo для синтаксического анализа? Имена объектов и ключей массива неизвестны. Есть ли какой-нибудь общий код, который может это сделать? В этом примере json все данные в ключе значения должны быть напечатаны. Пример Json:

"X": [
        {
            "Y": {
                "value": "Test"
            },
            "Z": {
                "value": 2
            }
}
]

Настоящий json может быть действительно большим с несколькими уровнями массивов и объектов.

NB: пожалуйста, не помечайте это как повторяющееся, как другие вопросы не о точном требовании.

Ответы [ 3 ]

1 голос
/ 06 мая 2020

Используя Jackson, вы можете прочитать \ загрузить JSON следующим образом:

private JsonNode loadJson(String json) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    JsonNode rootNode = mapper.readTree(json);
    return rootNode;
}

Sample JSON:

{
  "name":{
    "first":"Tatu",
    "last":"Saloranta"
  },
  "title":"Jackson founder",
  "company":"FasterXML",
  "pets":[
    {
      "type":"dog",
      "number":1
    },
    {
      "type":"fish",
      "number":50
    }
  ]
}

Чтобы проанализировать JSON:

String json = "{\"name\": {\"first\":\"Tatu\",\"last\":\"Saloranta\"},\"title\":\"Jackson founder\",\"company\":\"FasterXML\",\"pets\":[{\"type\":\"dog\",\"number\":1},{\"type\":\"fish\",\"number\":50}]}";

JsonNode rootNode = loadJson(json);

JsonNode nameNode = rootNode.get("name");
String firstName = nameNode.get("first").asText();
String lastName = nameNode.get("last").asText();

String title = rootNode.get("title").asText();
String company = rootNode.get("company").asText();

JsonNode petsArrayNode = rootNode.get("pets");
for (final JsonNode petNode : petsArrayNode ) {
  String type = petNode.get("type").asText();
  int number = petNode.get("number").asInt();
}

Подробнее читайте здесь: https://www.baeldung.com/jackson-json-node-tree-model

0 голосов
/ 06 мая 2020

Вы можете прочитать JSON как поток с помощью JsonParser из JSR 374 (JSON API обработки aka JSON -P):

import java.io.*;
import javax.json.Json;
import javax.json.stream.JsonParser;
import javax.json.stream.JsonParser.Event;

public static class ParserTest {
    public static void main(String[] args) {
        String jsonString = "{\"X\": [\n" +
                "        {\n" +
                "            \"Y\": {\n" +
                "                \"value\": \"Test\"\n" +
                "            },\n" +
                "            \"Z\": {\n" +
                "                \"value\": 2\n" +
                "            }\n" +
                "}\n" +
                "]}";
        JsonParser parser = Json.createParser(new StringReader(jsonString));
        String key = null;

        while (parser.hasNext()) {
            Event event = parser.next();

            switch (event) {
                case KEY_NAME:
                    key = parser.getString();
                    break;
                case VALUE_STRING:
                case VALUE_NUMBER:
                case VALUE_TRUE:
                case VALUE_FALSE:
                case VALUE_NULL:
                    System.out.println(key + ": " + parser.getString());
                    break;
            }
        }
    }
}

Вам необходимо включить glassfi sh реализацию

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.json</artifactId>
    <version>1.1.4</version>
</dependency>

Пример кода взят из https://www.tutorialspoint.com/how-to-parse-a-json-string-using-streaming-api-in-java

Подробнее о JSON -P можно узнать здесь: https://javaee.github.io/jsonp/

0 голосов
/ 06 мая 2020

вы можете использовать для этого Streaming API Джексона (он также довольно быстрый и скромный по потреблению памяти):

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...