У меня есть 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 для простых атрибутов из первого и второго резервирования и четыре карты из простых атрибутов из вложенных комнат. Что мне с этим делать? Я использую для этого Джексона, но если есть лучшая библиотека, дайте мне информацию.