Лучший способ проанализировать JSON с неизвестной структурой для сравнения с известной структурой? - PullRequest
1 голос
/ 12 июня 2019

У меня есть файл YAML, который я преобразую в JSON, а затем в объект Java, используя GSON .Это будет использоваться как стандартное определение, с которым я буду сравнивать другие файлы YAML.Файлы YAML, которые я буду проверять, должны содержать поля с структурами, идентичными моему определению.Однако вполне возможно, что он может содержать поля с другой структурой и поля, которые не существуют в моем определении, поскольку в конечном итоге пользователь должен создать эти поля до того, как я получу файл.Поле в проверяемом YAML может выглядеть следующим образом, с возможностью размещения столько уровней вложенности, сколько пользователь желает определить.

 LBU:
      type: nodes.Compute
      properties:
        name: LBU
        description: LBU
        configurable_properties: 
          test: {"additional_configurable_properties":{"aaa":"1"}}
        vdu_profile:
          min_number_of_instances: 1
          max_number_of_instances: 4
      capabilities:
        virtual_compute:
          properties:
            virtual_memory:
              virtual_mem_size: 8096 MB
            virtual_cpu:
              cpu_architecture: x86
              num_virtual_cpu: 2
              virtual_cpu_clock: 1800 MHz
      requirements:
      - virtual_storage:
          capability: capabilities.VirtualStorage
          node: LBU_Storage        

В настоящее время я получаю этот файл YAML и преобразовываю его вJsonObject с Gson.Невозможно отобразить это на объект Java из-за возможных неизвестных полей.Моя цель состоит в том, чтобы просмотреть этот файл и проверить каждое поле на предмет соответствия в моем определении.Если присутствует поле, которое не существует в определении или существует, но имеет свойства, которые отличаются, мне нужно сообщить пользователю конкретную информацию о поле.

Пока я иду по пути получения таких полей.

 for (String field : obj.get("topology_template").getAsJsonObject().get("node_template").getAsJsonObject().get(key).getAsJsonObject().get(
              obj.get("topology_template").getAsJsonObject().get("node_templates").getAsJsonObject().get(key).getAsJsonObject().keySet().toArray()[i].toString()).getAsJsonObject().keySet()) {

Однако, кажется, что это довольно излишне и очень трудно следовать для некоторых глубоко вложенных полей.

Что я хочу знать, так это то, что существует более простой способ обхода каждого поля объекта JsonObject без сопоставления его с объектом Java и без явного доступа к каждому полю по имени?

1 Ответ

0 голосов
/ 12 июня 2019

Я думаю, вы ищете что-то вроде потокового Json Parser:

Вот пример

String json
  = "{\"name\":\"Tom\",\"age\":25,\"address\":[\"Poland\",\"5th avenue\"]}";
JsonFactory jfactory = new JsonFactory();
JsonParser jParser = jfactory.createParser(json);

String parsedName = null;
Integer parsedAge = null;
List<String> addresses = new LinkedList<>();

while (jParser.nextToken() != JsonToken.END_OBJECT) {
    String fieldname = jParser.getCurrentName();
    if ("name".equals(fieldname)) {
        jParser.nextToken();
        parsedName = jParser.getText();
    }

    if ("age".equals(fieldname)) {
        jParser.nextToken();
        parsedAge = jParser.getIntValue();
    }

    if ("address".equals(fieldname)) {
        jParser.nextToken();
        while (jParser.nextToken() != JsonToken.END_ARRAY) {
            addresses.add(jParser.getText());
        }
    }
}
jParser.close();

Пожалуйста, найдите документацию здесь: https://github.com/FasterXML/jackson-docs/wiki/JacksonStreamingApi

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