Перепишите объект JsonNode на новый с новым именем атрибутов и минуя некоторые узлы - PullRequest
2 голосов
/ 13 июля 2020

Можно ли переписать (или обновить) JsonNode на новый с новыми именами атрибутов и обойти некоторые узлы?

Предположим, у меня есть Json как:

{
   "reservations":[
      {
         "id":"1318504",
         "deposit":720,
         "rooms":[
            {
               "name":"room1",
               "id":"28902"
            },
            {
               "name":"room2",
               "id":"28906"
            }
         ],
         "customers":[
            {
               "id":3,
               "country":"UK",
               "firstName":"John"
            }
         ]
      },
      {
         "id":"1318501",
         "deposit":68,
         "rooms":[
            {
               "name":"room3",
               "id":"28860"
            },
            {
               "name":"room4",
               "id":"28886"
            }
         ]
      }
   ]
}

Я прочитал это как

ObjectMapper mapper = new ObjectMapper();
ObjectNode node = (ObjectNode) mapper.readTree(new File("path to json file"));

И теперь я хотел бы иметь функцию типа JsonNode rewrite(List<String> ignoreData), и если я вызову ее с аргументами ignoreData = ["customers"], у меня будет новый JsonNode, который будет выглядеть так:

{
   "reservations":[
      {
         "reservations.id":"1318504",
         "reservations.deposit":720,
         "reservations.rooms":[
            {
               "reservations.rooms.name":"room1",
               "reservations.rooms.id":"28902"
            },
            {
               "reservations.rooms.name":"room2",
               "reservations.rooms.id":"28906"
            }
         ]
      },
      {
         "reservations.id":"1318501",
         "reservations.deposit":68,
         "reservations.rooms":[
            {
               "reservations.rooms.name":"room3",
               "reservations.rooms.id":"28860"
            },
            {
               "reservations.rooms.name":"room4",
               "reservations.rooms.id":"28886"
            }
         ]
      }
   ]
}

Возможно ли это с библиотекой Джексона? Псевдокод мне подходит.

1 Ответ

1 голос
/ 13 июля 2020

Самый простой способ удалить / управлять узлами json - использовать JsonPath. Это мощный инструмент для анализа, преобразования и выборочного извлечения данных из Json документов.

Это эквивалент Xpath, используемого для XML документов.

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

Код для удалите узел "клиенты" и переименуйте "id" в разделе оговорок. Аналогичным образом вы можете переименовать и другие поля:

    String content = FileUtils.readFileToString(new File("src/main/resources/sample.json"), "UTF-8");
    DocumentContext jsonContext = JsonPath.parse(content);
    jsonContext.delete("$.reservations[*].customers");
    jsonContext.renameKey("$.reservations[*]","id","reservations.id");
    System.out.println(jsonContext.jsonString());

Вывод:

{
   "reservations":[
      {
         "deposit":720,
         "rooms":[
            {
               "name":"room1",
               "id":"28902"
            },
            {
               "name":"room2",
               "id":"28906"
            }
         ],
         "reservations.id":"1318504"
      },
      {
         "deposit":68,
         "rooms":[
            {
               "name":"room3",
               "id":"28860"
            },
            {
               "name":"room4",
               "id":"28886"
            }
         ],
         "reservations.id":"1318501"
      }
   ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...