ObjectMapper
1. Зависимость
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
Эта зависимость также добавляет в путь к проекту следующие библиотеки:
- jackson-annotations-2.9.8.jar
- jackson-core-2.9.8.jar
- jackson-databind-2.9.8.jar
2. Сериализация и десериализация
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Car {
private String color;
private String type;
}
2.1 Сериализация объектов Java в Json
public class Main {
public static void main(String[] args) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
Car car = new Car("yellow", "renault");
objectMapper.writeValue(new File("target/car.json"), car);
}
}
Результат вывода car.json:
{"color":"yellow","type":"renault"}
writeValueAsString: преобразовать сгенерированный JSON в строку.
//{"color":"yellow","type":"renault"}
String carAsString = objectMapper.writeValueAsString(car);
writeValueAsBytes: преобразовать сгенерированный JSON в массив байтов.
2.2 Десериализация JSON в объект Java
public class Main {
public static void main(String[] args) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\"}";
Car car = objectMapper.readValue(json, Car.class);
System.out.println(car);
}
}
//输出结果:Car(color=Black, type=BMW)
Функция readValue() также принимает другие формы ввода, например файлы, содержащие строки JSON:
ObjectMapper objectMapper = new ObjectMapper();
String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\"}";
Car car = objectMapper.readValue(new File("target/json_car.json"), Car.class);
System.out.println(car);
//输出Car(color=yellow, type=renault)
или URL
Car car = objectMapper.readValue(new URL("target/json_car.json"), Car.class);
2.3 Десериализация JSON в Jackson JsonNode
Точно так же JSON можно анализировать как объект JsonNode для получения данных из определенного узла.
String json = "{ \"color\" : \"Black\", \"type\" : \"FIAT\" }";
JsonNode jsonNode = objectMapper.readTree(json);
String color = jsonNode.get("color").asText();
// Output: color -> Black
2.4 Десериализация массива JSON в список Java
используяTypeReferenceМожет десериализовать JSON в виде массива в массив Java
String jsonCarArray =
"[{ \"color\" : \"Black\", \"type\" : \"BMW\" },
{ \"color\" : \"Red\", \"type\" : \"FIAT\" }]";
List<Car> listCar = objectMapper.readValue(jsonCarArray,
new TypeReference<List<Car>>(){});
//[Car(color=Black, type=BMW), Car(color=Red, type=FIAT)]
System.out.println(listCar);
2.5 Десериализация строки JSON в карту Java
String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";
Map<String, Object> map
= objectMapper.readValue(json, new TypeReference<Map<String,Object>>(){});
//{color=Black, type=BMW}
System.out.println(map);
3. Дополнительные функции
JacksonСила библиотеки в том, что сериализацию и десериализацию можно настраивать.
3.1 Настройка функций сериализации и десериализации
По умолчанию десериализация завершается ошибкой, если строка JSON содержит свойства, которых нет у классов Java.
String jsonString
= "{ \"color\" : \"Black\", \"type\" : \"Fiat\", \"year\" : \"1970\" }";
//UnrecognizedPropertyException
Car car = objectMapper.readValue(jsonString, Car.class);
Установив метод, мы можем изменить поведение по умолчанию, чтобы игнорировать новые свойства поля.
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
String jsonString
= "{ \"color\" : \"Black\", \"type\" : \"Fiat\", \"year\" : \"1970\" }";
Car car = objectMapper.readValue(jsonString, Car.class);
//Car(color=Black, type=Fiat)
System.out.println(car);
сродниFAIL_ON_NULL_FOR_PRIMITIVES: позволяет значениям примитивных типов быть нулевыми.
Настроен как
objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
FAIL_ON_NUMBERS_FOR_ENUM: Контролирует, разрешено ли сериализовать/десериализовать значения перечисления как числа
Метод конфигурации:
objectMapper.configure(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS, false)
Дополнительные методы настройки см. на странице https://github.com/FasterXML/jackson-databind/wiki/Serialization-Features.
3.4 Работа с коллекциями
Еще одна небольшая, но полезная функция, предоставляемая классом DeserializationFeature, — это возможность генерировать нужный тип коллекции из ответа массива JSON.
Например, мы можем сгенерировать результат в виде массива:
String jsonCarArray =
"[{ \"color\" : \"Black\", \"type\" : \"BMW\" }, { \"color\" : \"Red\", \"type\" : \"FIAT\" }]";
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY, true);
Car[] cars = objectMapper.readValue(jsonCarArray, Car[].class);
// Car(color=Black, type=BMW)
//Car(color=Red, type=FIAT)
for (Car car : cars) {
System.out.println(car);
}
Or as a List:
String jsonCarArray =
"[{ \"color\" : \"Black\", \"type\" : \"BMW\" }, { \"color\" : \"Red\", \"type\" : \"FIAT\" }]";
List<Car> listCar = objectMapper.readValue(jsonCarArray, new TypeReference<List<Car>>(){});
// [Car(color=Black, type=BMW), Car(color=Red, type=FIAT)]
System.out.println(listCar);
Для получения дополнительной информации о работе с коллекциями см. https://www.baeldung.com/jackson-collection-array.