Маппинг многомерной структуры данных

125
22 ноября 2020, 02:20

У меня есть структура данных:

{
"id": 1,
"name": "Hello",
"hotel": {
 "floors": 3,
  "phone": "333-22-44"
  "rooms": [
    {
     "beds": 3
      ...
    }....
   ]
   ...
   }

Какое лучшее решение для маппинга этой структуры на сущности и обратно в json файл?

Answer 1

Я обычно использую Jackson.

Библиотека очень много всего разного умеет, самый простой юзкейс у нее это как раз Ваш вариант:

Для десериализации необходимо и достаточно завести в программе классы, описывающие структуру Вашего json, а затем вызвать

YourClass yourClassInstance = new ObjectMapper().readValue("{...}", YourClass.class);

для сериализации:

String json = objectMapper.writeValueAsString(yourClassInstance);
public class jackson {
    static String JSON = "{" +
            "\"id\": 1," +
            "\"name\": \"Hello\"," +
            "\"hotel\": {" +
            "  \"floors\": 3," +
            "  \"phone\": \"333-22-44\"," +
            "  \"rooms\": [{" +
            "     \"beds\": 3" +
            "    }]" +
            "  }" +
            "}";
    public static void main(String[] args) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        Trip trip = objectMapper.readValue(JSON, Trip.class);
        System.out.println("trip = " + trip);
        String json = objectMapper.writeValueAsString(trip);
        System.out.println("json = " + json);
    }
}

console:

trip = Trip{id=1, name='Hello', hotel=Hotel{floors=3, phone='333-22-44', rooms=[Room{beds=3}]}}
json = {"id":1,"name":"Hello","hotel":{"floors":3,"phone":"333-22-44","rooms":[{"beds":3}]}}
public class Trip {
    public long id;
    public String name;
    public Hotel hotel;
    @Override
    public String toString() {
        return "Trip{id=" + id + ", name='" + name + "', hotel=" + hotel + '}';
    }
}
public class Hotel {
    public int floors;
    public String phone;
    public List<Room> rooms;
    @Override
    public String toString() {
        return "Hotel{floors=" + floors + ", phone='" + phone + "', rooms=" + rooms + '}';
    }
}
public class Room {
    public int beds;
    @Override
    public String toString() {
        return "Room{beds=" + beds + '}';
    }
}

pom.xml

<dependencies>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.8</version>
    </dependency>
 </dependencies>
READ ALSO
Как работает строка кода? Лямбда, reduce

Как работает строка кода? Лямбда, reduce

Вечер добрыйНашёл вот такую прекрасную строку

112
Duplicate class android.arch.lifecycle.ViewModelStoreOwner

Duplicate class android.arch.lifecycle.ViewModelStoreOwner

я добавил TabbedActivity и теперь мой проект не работаетПри билде приложения я получаю такую ошибку

109
Добавление в данных в List&lt;&gt; Java

Добавление в данных в List<> Java

Есть такая конструкция:

104
Как работают исключения?

Как работают исключения?

Почему вот этот код выводит в консоль:

88