Разбор любых json на коллекции с картами - PullRequest
2 голосов
/ 11 июля 2020

У меня есть 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"
            }
         ]
      }
   ]
}

Мне нужно разобрать это Json на List<Map<String, String>>, как показано ниже:

Карта 1:

"reservations.id":"1318504",
"reservations.deposit":"720",
"reservations.rooms.name":"room1",
"reservations.rooms.id":"28902"
"reservations.customers.id":"3",
"reservations.customers.country": "UK"
"reservations.customers.firstName":"John"

Карта 2:

"reservations.id":"1318504"
"reservations.deposit":"720"
"reservations.rooms.name":"room2"
"reservations.rooms.id":"28906" 
"reservations.customers.id":"3"
"reservations.customers.country": "UK",
"reservations.customers.firstName":"John"

    

Карта 3:

"reservations.id":"1318501"
"reservations.deposit":"68"
"reservations.room.name":"room3"
"reservations.room.id":"28860"
"reservations.customers.id":""
"reservations.customers.country": ""
"reservations.customers.firstName":""

Карта 4:

"reservations.id":"1318501"
"reservations.deposit":"68"
"reservations.room.name":"room4"
"reservations.room.id":"28886"
"reservations.customers.id":""
"reservations.customers.country": ""
"reservations.customers.firstName":"" 

Таким образом, на словах я должен принять эти две оговорки. Затем я просто собираю атрибуты и объединяю их вложенными атрибутами (в комнатах и ​​клиентах). Затем я присоединяюсь к вложенным атрибутам.

Основная проблема в том, что этот Json является только примером. Уровень вложенности, количество атрибутов, их имя и значения и так далее могут быть любыми. Более того, если атрибут существует в одном резервировании, а в другом нет - тогда я помещаю пустое значение (например, клиенты в моем случае).

Я пытаюсь сделать это:

static List<Map<String, String>> maps = new LinkedList<>();
public static void main(String[] args) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    JsonNode node = mapper.readTree(new File("pathToAnyJson.json"));
    process(node, "");
    maps.forEach(map -> System.out.println(map));

}

Где функция процесса это:

static void process(JsonNode node, String parentName){
    Map<String,String> values = new LinkedHashMap<>();
    if(node.isObject()){
        ObjectNode objectNode = (ObjectNode) node;
        objectNode.fields().forEachRemaining(entry -> {
            String name = entry.getKey();
            String nodeName = parentName + "." + name;
            JsonNode n = entry.getValue();
            if(!n.isArray() && !n.isObject()){
                values.put(nodeName, n.asText());
            }
            process(n, nodeName);
        } );
        maps.add(values);
    } else if(node.isArray()){
        ArrayNode arrayNode = (ArrayNode) node;
        for(JsonNode jsonNode : arrayNode){
            process(jsonNode,parentName);
        }
    }
}

Но с этим кодом я получил 6 карт - 2 для простых атрибутов из первого и второго резервирования и четыре карты из простых атрибутов из вложенных комнат. Что мне с этим делать? Я использую для этого Джексона, но если есть лучшая библиотека, дайте мне информацию.

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