- Jackson — ObjectMapper Class
- Class Declaration
- Nested Classes
- Fields
- Constructors
- Methods
- Methods inherited
- ObjectMapper Example
- Jackson ObjectMapper
- Качаем jar-ники
- Сериализация в JSON
- Десериализация из JSON
- Игнорируем неизвестные свойства
- Удобные аннотации
- Сериализация и десериализация в XML
- Сериализация и десериализация в YAML
Jackson — ObjectMapper Class
ObjectMapper is the main actor class of Jackson library. ObjectMapper class ObjectMapper provides functionality for reading and writing JSON, either to and from basic POJOs (Plain Old Java Objects), or to and from a general-purpose JSON Tree Model (JsonNode), as well as related functionality for performing conversions. It is also highly customizable to work both with different styles of JSON content, and to support more advanced Object concepts such as polymorphism and Object identity. ObjectMapper also acts as a factory for more advanced ObjectReader and ObjectWriter classes.
Class Declaration
Following is the declaration for com.fasterxml.jackson.databind.ObjectMapper class −
public class ObjectMapper extends ObjectCodec implements Versioned, Serializable
Nested Classes
Customized TypeResolverBuilder that provides type resolver builders used with so-called «default typing» (see enableDefaultTyping() for details).
Enumeration used with enableDefaultTyping() to specify what kind of types (classes) default typing should be used for.
Fields
- protected DeserializationConfig _deserializationConfig — Configuration object that defines basic global settings for the serialization process.
- protected DefaultDeserializationContext _deserializationContext — Blueprint context object; stored here to allow custom sub-classes.
- protected InjectableValues _injectableValues — Provider for values to inject in deserialized POJOs.
- protected JsonFactory _jsonFactory — Factory used to create JsonParser and JsonGenerator instances as necessary.
- protected SimpleMixInResolver _mixIns — Mapping that defines how to apply mix-in annotations: key is the type to received additional annotations, and value is the type that has annotations to «mix in».
- protected ConfigOverrides _propertyOverrides — Currently active per-type configuration overrides, accessed by declared type of property.
- protected Set _registeredModuleTypes — Set of module types (as per Module.getTypeId() that have been registered; kept track of iff MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS is enabled, so that duplicate registration calls can be ignored (to avoid adding same handlers multiple times, mostly).
- protected ConcurrentHashMap
_rootDeserializers — We will use a separate main-level Map for keeping track of root-level deserializers. - protected SerializationConfig _serializationConfig — Configuration object that defines basic global settings for the serialization process.
- protected SerializerFactory _serializerFactory — Serializer factory used for constructing serializers.
- protected DefaultSerializerProvider _serializerProvider — Object that manages access to serializers used for serialization, including caching.
- protected SubtypeResolver _subtypeResolver — Thing used for registering sub-types, resolving them to super/sub-types as needed.
- protected TypeFactory _typeFactory — Specific factory used for creating JavaType instances; needed to allow modules to add more custom type handling (mostly to support types of non-Java JVM languages).
- protected static AnnotationIntrospector DEFAULT_ANNOTATION_INTROSPECTOR
- protected static BaseSettings DEFAULT_BASE — Base settings contain defaults used for all ObjectMapper instances.
- protected static VisibilityChecker STD_VISIBILITY_CHECKER
Constructors
Default constructor, which will construct the default JsonFactory as necessary, use SerializerProvider as its SerializerProvider, and BeanSerializerFactory as its SerializerFactory.
Constructs instance that uses specified JsonFactory for constructing necessary JsonParsers and/or JsonGenerators.
Constructs instance that uses specified JsonFactory for constructing necessary JsonParsers and/or JsonGenerators, and uses given providers for accessing serializers and deserializers.
Copy-constructor, mostly used to support copy().
Methods
Methods inherited
This class inherits methods from the following classes:
ObjectMapper Example
Create the following java program using any editor of your choice in say C:/> Jackson_WORKSPACE
File: JacksonTester.java
import java.io.IOException; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonTester < public static void main(String args[])< ObjectMapper mapper = new ObjectMapper(); String jsonString = ""; //map json to student try < Student student = mapper.readValue(jsonString, Student.class); System.out.println(student); jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(student); System.out.println(jsonString); >catch (JsonParseException e) < e.printStackTrace();>catch (JsonMappingException e) < e.printStackTrace(); >catch (IOException e) < e.printStackTrace(); >> > class Student < private String name; private int age; public Student()<>public String getName() < return name; >public void setName(String name) < this.name = name; >public int getAge() < return age; >public void setAge(int age) < this.age = age; >public String toString() < return "Student [ name: "+name+", age: "+ age+ " ]"; >>
Compile the classes using javac compiler as follows:
C:\Jackson_WORKSPACE>javac JacksonTester.java
Now run the jacksonTester to see the result:
C:\Jackson_WORKSPACE>java JacksonTester
Student [ name: Mahesh, age: 21 ]
Jackson ObjectMapper
Jackson — это популярная библиотека для сериализации/десериализации Java-объектов в различные текстовые форматы. Основной функционал для работы с форматом JSON — класс ObjectMapper . А работать с другими форматами помогут его наследники ( XmlMapper , YAMLMapper ). Благодаря наследованию работа со всеми форматами будет происходить единообразно, через единый интерфейс.
Качаем jar-ники
Перед тем, как изучить примеры, нужно скачать jar-файлы Jackson-а и подключить их к проекту в IntellijIDEA. Рассмотрим, как искать нужные файлы на примере jackson-databind :
- Перейди на сайт Maven Repository.
- В поисковую строку введи “ jackson-databind ”, получишь результат:
- Нас интересует первый результат поиска, переходим по ссылке.
Аналогично можно найти и скачать остальные необходимые jar-ники:
Скачав все необходимые файлы, подключи их к проекту в IntellijIDEA:
- Открой настройки проекта (это можно сделать комбинацией Ctrl+Alt+Shift+S ).
- Перейди в Libraries .
- Жми + , затем Java, выбери все скачанные файлы. Должно получиться так:
- На этом подготовка закончена, будем пробовать ObjectMapper в деле.
Сериализация в JSON
Сначала сериализуем какой-нибудь объект в JSON:
import com.fasterxml.jackson.databind.ObjectMapper; class Book < public String title; public String author; public int pages; >public class Solution < public static void main(String[] args) throws Exception < Book book = new Book(); book.title = "Обитаемый остров"; book.author = "Стругацкий А., Стругацкий Б."; book.pages = 413; ObjectMapper mapper = new ObjectMapper(); String jsonBook = mapper.writeValueAsString(book); System.out.println(jsonBook); >>
Запустив main , получишь такой вывод:
У ObjectMapper -а есть много дополнительных настроек. Воспользуемся одной из них, чтобы JSON-строка была удобочитаемо отформатирована. После создания объекта ObjectMapper выполним команду:
Информация в выводе осталась та же, но добавились отступы и переносы строк:
Десериализация из JSON
Теперь выполним обратное действие: десериализуем строку в объект. Чтобы можно было оценить работу программы, в класс Book добавим метод toString :
@Override public String toString() < return "Bookmain: public static void main(String[] args) throws Exception < String jsonString = ""; Book book = new ObjectMapper().readValue(jsonString, Book.class); System.out.println(book); >
Метод readValue перегружен, у него есть много вариаций, принимающих файл, ссылку, различные потоки чтения и т. д. Для упрощения в нашем примере использован вариант, принимающий JSON в виде строки.
Как уже говорилось выше, ObjectMapper имеет много настроек, рассмотрим некоторые из них.
Игнорируем неизвестные свойства
Рассмотрим ситуацию, когда у JSON-строки есть свойство, которого нет в классе Book :
public static void main(String[] args) throws Exception < String jsonString = """ < "title" : "Обитаемый остров", "author" : "Стругацкий А., Стругацкий Б.", "pages" : 413, "unknown property" : 42 >"""; ObjectMapper mapper = new ObjectMapper(); Book book = mapper.readValue(jsonString, Book.class); System.out.println(book); >
Попытавшись выполнить этот код, получим UnrecognizedPropertyException . Такое поведение установлено по умолчанию, но мы можем его изменить:
ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
При создании объекта ObjectMapper используем метод configure , чтобы установить нужную настройку в false . Метод configure изменяет объект, у которого его вызвали, и возвращает этот же объект, поэтому его можно вызывать и по-другому:
ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
По функциональности такая запись аналогична предыдущей.
Если теперь запустить main , десериализация пройдет успешно, а unknown property будет проигнорировано.
Удобные аннотации
Jackson предоставляет нам ряд аннотаций для всесторонней кастомизации сериализации. Рассмотрим несколько самых полезных:
@JsonIgnore — ставится над элементом, который нужно игнорировать при сериализации/десериализации:
В результате при сериализации поле author не попадет в результирующий JSON. При десериализации поле author получит значение по умолчанию (null), даже если в JSON-е было другое значение.
@JsonFormat — позволяет задать формат сериализованных данных. Добавим в класс Book еще одно поле типа Date :
После сериализации получим такой JSON:
<
"title" : "Обитаемый остров",
"author" : "Стругацкий А., Стругацкий Б.",
"pages" : 413,
"createdDate" : 1649330880788
>
Как видишь, дата сериализировалась в виде числа. Добавим аннотацию и зададим формат:
Теперь результат сериализации:
<
"title" : "Обитаемый остров",
"author" : "Стругацкий А., Стругацкий Б.",
"pages" : 413,
"createdDate" : "2022-04-07"
>
@JsonProperty — позволяет изменить имя свойства, в которое будет сериализировано поле. Еще этой аннотацией можно помечать методы, и их возвращаемое значение будет преобразовано в JSON-свойство при сериализации:
<
"author" : "Стругацкий А., Стругацкий Б.",
"pages" : 413,
"name" : "Обитаемый остров",
"quotedTitle" : "«Обитаемый остров»"
>
@JsonInclude — с помощью этой аннотации можно указать, в каком случае поле должно сериализироваться. Можно добавлять как отдельным полям, так и всему классу. Сначала попробуем сериализовать объект с неинициализированными полями:
А если добавить аннотацию:
@JsonInclude(JsonInclude.Include.NON_NULL) class Book
Теперь поля, имеющие значение null , не сериализовались.
@JsonPropertyOrder — позволяет задать порядок сериализации полей:
@JsonPropertyOrder() class Book
Сейчас можешь просто запомнить, как использовать аннотации, а в конце этого модуля будем более детально с ними знакомиться и создавать собственные аннотации.
Сериализация и десериализация в XML
Если нужно сериализовать в XML-формат, можем использовать все те же настройки и аннотации. Единственным отличием будет реализация объекта mapper :
public static void main(String[] args) throws Exception
Стругацкий А., Стругацкий Б. 413
public static void main(String[] args) throws Exception < String xmlString = """ Стругацкий А., Стругацкий Б. 413 """; ObjectMapper mapper = new XmlMapper(); Book book = mapper.readValue(xmlString, Book.class); System.out.println(book); >
Сериализация и десериализация в YAML
Аналогично XML действуем и с YAML:
public static void main(String[] args) throws Exception
public static void main(String[] args) throws Exception