Используются для настройки операций во время сериализации и десериализации. Их функции следующие:
Используется для указания пользовательского сериализатора для преобразования объектов Java в строки JSON.
Вы можете указать используемый сериализатор, используя аннотацию @JsonSerialize на уровне свойства, метода получения или класса.
Это позволяет вам контролировать преобразование объектов в строки JSON, включая форматирование значений настраиваемых полей, преобразования типов и многое другое.
Используется для указания пользовательского десериализатора для преобразования строки JSON в объект Java.
Вы можете указать используемый десериализатор, используя аннотацию @JsonDeserialize на уровне свойства, метода установки или класса.
Это дает вам контроль над преобразованием строк JSON в объекты, включая обработку специальных форматов, преобразование типов и многое другое.
import com.fasterxml.jackson.annotation.JsonDeserialize;
import com.fasterxml.jackson.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@JsonSerialize(using = CustomSerializer.class)
@JsonDeserialize(using = CustomDeserializer.class)
public class Person {
private String name;
private int age;
// Опустить конструктор и методы получения/установки.
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
Person person = new Person("John", 30);
String json = mapper.writeValueAsString(person);
System.out.println(json); // Вывод: {"fullName":"Джон","years":30}
Person deserializedPerson = mapper.readValue(json, Person.class);
System.out.println(deserializedPerson); // Вывод: Person{name='Джон', age=30}
}
}
class CustomSerializer extends JsonSerializer<Person> {
@Override
public void serialize(Person person, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("fullName", person.getName());
jsonGenerator.writeNumberField("years", person.getAge());
jsonGenerator.writeEndObject();
}
}
class CustomDeserializer extends JsonDeserializer<Person> {
@Override
public Person deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
JsonNode node = jsonParser.getCodec().readTree(jsonParser);
String fullName = node.get("fullName").asText();
int years = node.get("years").asInt();
return new Person(fullName, years);
}
}
В приведенном выше примере мы использовали аннотацию @JsonSerialize(using = CustomSerializer.class) для указания пользовательского сериализатора CustomSerializer, который преобразует объект Person в строку JSON, содержащую поля «fullName» и «years». В то же время мы использовали аннотацию @JsonDeserialize(using = CustomDeserializer.class), чтобы указать пользовательский десериализатор CustomDeserializer, который анализирует поля «fullName» и «years» в строке JSON в объекты Person.
Используя аннотации @JsonSerialize и @JsonDeserialize, вы можете гибко управлять операциями во время сериализации и десериализации, включая настраиваемое именование полей, преобразование формата и т. д.
Функция: указывает имя атрибута, используемое во время сериализации и десериализации JSON.
public class MyClass {
@JsonProperty("customName")
private String property;
// Getter and Setter methods
}
Функция: предписывает Джексону игнорировать аннотированные свойства во время сериализации и десериализации.
public class MyClass {
@JsonIgnore
private String property;
// Getter and Setter methods
}
Используется для указания того, как форматируются специальные типы полей, такие как даты и время, при сериализации или десериализации объектов Java в строки JSON или из них. Его функция — управлять форматом сериализации и десериализации специальных типов полей, таких как дата и время.
Вот некоторые распространенные варианты использования аннотации @JsonFormat:
Вы можете использовать аннотацию @JsonFormat, чтобы указать формат поля даты при сериализации в строку JSON и формат при десериализации из строки JSON в объект Java.
import com.fasterxml.jackson.annotation.JsonFormat;
public class Event {
@JsonFormat(pattern = "yyyy-MM-dd")
private Date eventDate;
// Опустить конструктор и методы получения/установки.
}
В приведенном выше примере мы указали, что поле eventDate использует формат даты «гггг-ММ-дд» при сериализации и десериализации.
Помимо дат вы также можете использовать аннотацию @JsonFormat, чтобы указать, как форматируются поля времени.
import com.fasterxml.jackson.annotation.JsonFormat;
public class Meeting {
@JsonFormat(pattern = "HH:mm:ss")
private LocalTime startTime;
// Опустить конструктор и методы получения/установки.
}
В этом примере мы указываем, что поле startTime принимает формат времени «ЧЧ:мм:сс» при сериализации и десериализации.
Помимо атрибута шаблона, аннотация @JsonFormat также поддерживает другие атрибуты, такие как часовой пояс, форма и т. д., для более детального управления поведением сериализации и десериализации полей.
import com.fasterxml.jackson.annotation.JsonFormat;
public class Payment {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT+8")
private LocalDateTime paymentTime;
// Опустить конструктор и методы получения/установки.
}
В приведенном выше примере мы использовали аннотацию @JsonFormat, чтобы указать, что поле payTime отформатировано в формате ISO8601, а часовой пояс — GMT+8.
Используя аннотацию @JsonFormat, вы можете гибко управлять форматами сериализации и десериализации специальных типов полей, таких как дата и время, чтобы обеспечить правильное преобразование между данными JSON и объектами Java.
Когда используется аннотация @JsonUnwrapped, она играет следующие роли во время сериализации и десериализации:
Во время процесса сериализации аннотация @JsonUnwrapped сообщает библиотеке Джексона объединить свойства вложенного объекта с внешним объектом, включая таким образом свойства вложенного объекта непосредственно в сгенерированные данные JSON. Это уменьшает иерархию результирующей структуры JSON, делая ее более плоской.
Во время процесса десериализации аннотация @JsonUnwrapped сообщает библиотеке Джексона извлечь указанное значение свойства из данных JSON и заполнить его в соответствующее свойство внешнего объекта. Это позволяет напрямую сопоставлять плоскую структуру данных JSON со свойствами внешнего объекта, упрощая логику кода для обработки вложенных структур.
Ниже приведен пример использования аннотации @JsonUnwrapped:
Рассмотрим класс Java с именем «Сотрудник», который содержит вложенные объекты «Адрес»:
import com.fasterxml.jackson.annotation.JsonUnwrapped;
public class Employee {
private String name;
@JsonUnwrapped
private Address address;
// Опустить конструктор и методы получения/установки.
}
public class Address {
private String city;
private String street;
// Опустить конструктор и методы получения/установки.
}
Если у вас есть объект «Сотрудник» с именем «Сотрудник»:
Employee employee = new Employee("John Doe", new Address("New York", "123 Main St"));
При сериализации объект сотрудника будет преобразован в следующую структуру JSON:
{
"name": "John Doe",
"city": "New York",
"street": "123 Main St"
}
При десериализации следующие данные JSON:
{
"name": "Jane Smith",
"city": "San Francisco",
"street": "456 Elm St"
}
Будет преобразован в объект «Сотрудник», содержащий соответствующие свойства.
В дополнение к базовому использованию аннотация @JsonUnwrapped также поддерживает некоторые атрибуты, такие как префикс и суффикс, которые используются для управления тем, будут ли развернутые свойства иметь префикс или суффикс при слиянии с внешним объектом.
import com.fasterxml.jackson.annotation.JsonUnwrapped;
public class Contact {
@JsonUnwrapped(prefix = "home_")
private Address homeAddress;
@JsonUnwrapped(prefix = "work_")
private Address workAddress;
// Опустить конструктор и методы получения/установки.
}
В этом примере мы используем атрибут префикса аннотации @JsonUnwrapped. Когда атрибуты объектов homeAddress и workAddress расширяются в объект Contact, префиксы будут добавлены перед именами атрибутов: «home_» и «work_». соответственно.
В этом примере вы можете увидеть, что после использования аннотации @JsonUnwrapped свойства вложенного объекта напрямую объединяются с внешним объектом, что делает преобразование между данными JSON и объектами Java более кратким и интуитивно понятным.
Функция: используется для вывода свойств объекта в виде карты в виде пар ключ-значение, включая динамические свойства. Включите динамические свойства в JSON в виде пар ключ-значение.
Пример кода:
public class MyClass {
private Map<String, Object> properties = new HashMap<>();
@JsonAnyGetter
public Map<String, Object> getProperties() {
return properties;
}
public void addProperty(String key, Object value) {
properties.put(key, value);
}
}
В приведенном выше примере метод getProperties помечен аннотацией @JsonAnyGetter для вывода динамических свойств объекта в виде карты в виде пар ключ-значение. Свойства можно динамически добавлять на карту свойств с помощью метода addProperty.
Используется для управления обработкой нулевых значений свойств во время сериализации. Его цель — указать, включаются ли поля с нулевыми значениями атрибутов при преобразовании объекта в строку JSON.
Аннотация @JsonInclude может применяться на уровне класса или на уровне свойства.
При применении на уровне класса аннотация @JsonInclude указывает стратегию обработки значений NULL по умолчанию, которая будет применяться ко всем свойствам всего класса.
Установив атрибут value @JsonInclude, вы можете указать нулевую стратегию обработки во время сериализации. К часто используемым значениям относятся:
Include.ALWAYS:Всегда содержит значения атрибутов null поле.
Include.NON_NULL:Содержит только значения атрибутов, которые не являются null поле.
Include.NON_EMPTY:Содержит только значения атрибутов, которые не являются null И не пустое (типа пустое нить, пустой набор) поле.
Include.USE_DEFAULTS:использоватьпо умолчаниюиз null стратегии обработки.
При применении на уровне свойства @JsonInclude Аннотации могут переопределять настройки по умолчанию на уровне класса. null стратегию обработки, определяющую независимую null стратегии обработки.
Установив атрибут значения @JsonInclude, вы можете указать нулевую стратегию обработки для этого атрибута во время сериализации. Значение совпадает с аннотацией уровня класса.
Вот пример, демонстрирующий, как использовать аннотацию @JsonInclude:
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Person {
private String name;
private Integer age;
private String address;
// Опустить конструктор и методы получения/установки.
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
Person person = new Person("John", null, null);
String json = mapper.writeValueAsString(person);
System.out.println(json); // Вывод: {"name":"Джон"}
Person deserializedPerson = mapper.readValue(json, Person.class);
System.out.println(deserializedPerson); // Вывод: Person{name='Джон', age=null, address=null}
}
}
В приведенном выше примере @JsonInclude(JsonInclude.Include.NON_NULL) Аннотация применяется на уровне класса, указывая, что в процесс сериализации включаются только значения атрибутов. null Поэтому только поле. name поля включены в окончательный сгенерированный JSON в то время как age и address Поле имеет значение null и был проигнорирован.
эффект:Укажите атрибутыиз Псевдоним,Измените псевдоним на Свойства включения в обратной сериализации.
Пример кода:
public class MyClass {
@JsonAlias({"name", "fullName"})
private String property;
// Getter and Setter methods
}
В приведенном выше коде используйте @JsonAlias В аннотации указано name и fullName Эти два псевдонима, когда JSON Когда эти два ключа будут включены в данные, они будут связаны с property Свойства отображены.
эффект:указано всериализацияипротивоположныйсериализацияпроцесссерединанужно игнорироватьизсвойство。
Пример кода:
@JsonIgnoreProperties({"property1", "property2"})
public class MyClass {
private String property1;
private String property2;
private String property3;
// Getter and Setter methods
}
В приведенном выше коде используйте @JsonIgnoreProperties В аннотации указаноигнорировать property1 и property2 Эти два свойства игнорируются в процедуре сериализации и антисериализации середина.
эффект:Используется для разрешения циклических ссылок.извопрос,То есть между определенным объектом и другим объектом существуют взаимные ссылки.
Пример кода:
public class Parent {
private String name;
@JsonManagedReference
private List<Child> children;
// Getter and Setter methods
}
public class Child {
private String name;
@JsonBackReference
private Parent parent;
// Getter and Setter methods
}
В приведенном выше коде аннотация @JsonManagedReference используется для аннотирования коллекции дочерних объектов в родительском объекте, а аннотация @JsonBackReference используется для аннотирования ссылки на родительский объект в дочернем объекте. Это предотвращает проблемы бесконечной рекурсии, вызванные циклическими ссылками.
эффект:существоватьпротивоположныйсериализацияпроцесссередина,Используется для указания статического фабричного метода или конструктора.,Используется для создания экземпляров объектов.
Пример кода:
public class MyClass {
private String property;
@JsonCreator
public MyClass(@JsonProperty("property") String property) {
this.property = property;
}
// Getter method for property
}
В приведенном выше коде используйте @JsonCreator Аннотация аннотирует конструктор и передает @JsonProperty Указанные атрибуты и JSON Поля сопоставлены.
эффект:существоватьсериализацияипротивоположныйсериализацияпроцесссередина,Используется для обработки полиморфных типов.
Пример кода:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "dog"),
@JsonSubTypes.Type(value = Cat.class, name = "cat")
})
public abstract class Animal {
// Common properties and methods
}
public class Dog extends Animal {
// Dog-specific properties and methods
}
public class Cat extends Animal {
// Cat-specific properties and methods
}
В приведенном выше коде используйте @JsonTypeInfo В аннотации указывается тип информации в сериализациии сериализациисерединаизобработки и использования @JsonSubTypes Аннотации отмечают производные классы и соответствующие им идентификаторы типов.
Используется для динамической фильтрации свойств для включения во время сериализации. Он позволяет динамически указывать свойства для сериализации во время выполнения, что очень полезно в определенных сценариях, например, при принятии решения о том, что сериализовать, на основе разрешений пользователя или других условий.
Во-первых, вам нужно определить фильтр, присвоив ему имя, и применить его к классам, которым требуется динамическая фильтрация.
import com.fasterxml.jackson.annotation.JsonFilter;
@JsonFilter("myFilter")
public class MyDto {
private String name;
private int age;
private String email;
// Опустить конструктор и методы получения/установки.
}
В приведенном выше примере мы определили фильтр с именем «myFilter» для класса MyDto, используя аннотацию @JsonFilter.
Далее вам необходимо настроить ObjectMapper для использования этого фильтра.
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
ObjectMapper mapper = new ObjectMapper();
SimpleFilterProvider filterProvider = new SimpleFilterProvider();
filterProvider.addFilter("myFilter", SimpleBeanPropertyFilter.filterOutAllExcept("name", "age"));
mapper.setFilterProvider(filterProvider);
В этом примере мы создаем SimpleFilterProvider и используйте addFilter Метод применяет фильтр к ObjectMapper середина. В этот конкретный фильтр мы включили только “name” и “age” Два атрибута.
Наконец, при сериализации вы можете указать используемый фильтр.
String json = mapper.writer(filterProvider).writeValueAsString(myDto);
В этом примере мы используем фильтр, настроенный ObjectMapper Объект придет myDto Объект сериализуется как JSON нить. Во время сериализации только “name” и “age” Два атрибута, потому что мы указали это Два в фильтре середина атрибута.
Используя аннотацию @JsonFilter, вы можете динамически фильтровать атрибуты, подлежащие сериализации, и гибко управлять результатами сериализации в соответствии с вашими потребностями. Это очень полезно для создания гибких API-интерфейсов RESTful или управления динамическим контролем разрешений.
эффект:Позволяет сопоставить несовпадающее с конкретнымполе Пары ключ-значение динамически вводятся в Java в объекте.
Пример кода:
public class MyClass {
private Map<String, Object> additionalProperties = new HashMap<>();
@JsonAnySetter
public void setAdditionalProperty(String key, Object value) {
additionalProperties.put(key, value);
}
}
В приведенном выше примере метод setAdditionalProperty помечен аннотацией @JsonAnySetter. При десериализации объекта JSON несовпадающие пары ключ-значение будут вставлены в поле дополнительных свойств.
эффект:Разрешить пользователямсуществоватьсериализациядинамически добавленосвойствоприезжать JSON Объект, эти свойства могут происходить из Java Различные поля или методы объекта.
Пример кода:
@Getter
@Setter
@AllArgsConstructor(staticName = "of")
@NoArgsConstructor
@JsonAppend(attrs = {@JsonAppend.Attr(value = "age"),@JsonAppend.Attr(value = "height")},
props = {@JsonAppend.Prop(value =TestWriter.class ,type = String.class,name = "version")})
class JsonPropertyPojo{
private String sex;
private String name;
private String unknown;
}
@NoArgsConstructor
class TestWriter extends VirtualBeanPropertyWriter{
private TestWriter(BeanPropertyDefinition propDef, Annotations contextAnnotations, JavaType declaredType) {
super(propDef, contextAnnotations, declaredType);
}
@Override
protected Object value(Object bean, JsonGenerator gen, SerializerProvider prov) throws Exception {
Field nameField = ReflectionUtils.findField(bean.getClass(),"name");
ReflectionUtils.makeAccessible(nameField);
if( nameField.get(bean).toString().length()>2){
return "1.2";
}
return "1.0";
}
@Override
public VirtualBeanPropertyWriter withConfig(MapperConfig<?> config, AnnotatedClass declaringClass, BeanPropertyDefinition propDef, JavaType type) {
return new TestWriter(propDef, declaringClass.getAnnotations(), type);
}
}
# Тест заключается в следующем
@Test
public void JsonAppendTest() throws Exception{
CombineJacksonAnnotation.JsonPropertyPojo pojo = JointJacksonAnnotation.JsonPropertyPojo.of("мужчина","Сяо Сяо Лю","некоторые");
System.out.println(om.writerFor(CombineJacksonAnnotation.JsonPropertyPojo.class).withAttribute("age","10").withAttribute("height","12").writeValueAsString(pojo));
}
# Результаты сериализации следующие
{
"sex" : "мужской",
"name" : «Сяо Сяо Лю»,
"unknown" : "some",
"age" : "10",
"height" : "12",
"version" : "1.2"
}
Как вы можете видеть из приведенного выше примера, @JsonAppend предоставляет два способа динамического добавления виртуальных полей.
эффект: инструктировать Jackson В процессе сериализации и антисериализации середина игнорируется типом аннотацияиз. Это значит быть @JsonIgnoreType Аннотированный тип будет полностью проигнорирован и не будет включен в окончательный сгенерированный файл. JSON , не будет использоваться для десериализации.
Обычно @JsonIgnoreType аннотации будут использоваться для некоторых вспомогательных изданий, не обязательно должны быть типа сериализации или анти-сериализации, или каких-либо других JSON Независимые от взаимодействия типы. Используя @JsonIgnoreType аннотация, вы можете сказать Jackson Игнорируйте эти типы, чтобы избежать JSON сериализации, процесс обратной сериализации середина обрабатывает их.
import com.fasterxml.jackson.annotation.JsonIgnoreType;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
MyEntity entity = new MyEntity("John", new AdditionalInfo("some info"));
String json = mapper.writeValueAsString(entity);
System.out.println(json); // Вывод: {"name":"Джон"}
MyEntity deserializedEntity = mapper.readValue(json, MyEntity.class);
System.out.println(deserializedEntity); // Вывод: MyEntity{name='Джон', additionalInfo=null}
}
}
@JsonIgnoreType
class AdditionalInfo {
private String info;
// Опустить конструктор и методы получения/установки.
}
class MyEntity {
private String name;
private AdditionalInfo additionalInfo;
// Опустить конструктор и методы получения/установки.
}
В приведенном выше примере Дополнительная информация Классы отмечены как @JsonIgnoreType, поэтому процедура сериализации, обратная сериализации середина, будет игнорироваться. Верно MyEntity Когда объект сериализуется, только name поля будут включены в окончательный вариант JSON в то время как additionalInfo поля будут игнорироваться. При десериализации, даже если JSON включен в additionalInfo поле, оно также не будет использоваться для построения MyEntity объект.
эффект: Используется для указания процесса сериализации и обратной сериализации. JSON Правила именования атрибутов и методы чтения и записи пользовательских атрибутов. Их эффект заключается в следующем:
import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
String json = "{\"first_name\":\"John\",\"last_name\":\"Doe\"}";
Person person = mapper.readValue(json, Person.class);
System.out.println(person.getFullName()); // Результат: Джон Doe
String outputJson = mapper.writeValueAsString(person);
System.out.println(outputJson); // Имя: {"first_name":"Джон","last_name":"Доу"}
}
}
class Person {
private String firstName;
private String lastName;
@JsonGetter("full_name")
public String getFullName() {
return firstName + " " + lastName;
}
@JsonSetter("first_name")
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@JsonSetter("last_name")
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
В приведенном выше примере Person в классе getFullName используемый метод @JsonGetter(“full_name”) Аннотация для указания возвращаемого атрибута полного имени, соответствующего JSON Имя атрибута "полное имя". В то же время setFirstName и setLastName используемый метод @JsonSetter аннотации, чтобы указать соответствующие им JSON Имя свойства.
Используя @JsonGetter и @JsonSetter Обратите внимание: вы можете Jackson сериализацияи процесс антисериализации середина гибко контролируется JSON Свойства: правила именования и пользовательские атрибуты, а также методы чтения и записи.
эффект: В общем java pojo Объект сериализуется в json строка, используйте @JsonPropertyOrder Свойства можно указать в json порядок в строке
Вот некоторые из наиболее часто используемых модулей библиотеки Джексона:
эффект:предоставил JSON основная функция сериализации и антисериализации, вы можете Java объекти JSON Преобразование данных.
Пример кода:
ObjectMapper objectMapper = new ObjectMapper();
MyClass myObject = objectMapper.readValue(json, MyClass.class);
String json = objectMapper.writeValueAsString(myObject);
эффект:предоставилсерияаннотация,Варианты управления поведением процесса сериализации и антисериализации серединаизи.
Пример кода:
public class MyClass {
@JsonProperty("my_property")
private String property;
// Getter and Setter methods
}
эффект:Предоставьте некоторые основные инструментыифункция,Используется для поддержки процедуры сериализации и анти-сериализации, необходимой для преобразования типов и других операций.
Пример кода:
// Convert JSON string to JsonNode object
JsonNode jsonNode = objectMapper.readTree(jsonString);
// Convert object to Map
Map<String, Object> map = objectMapper.convertValue(myObject, new TypeReference<Map<String, Object>>() {});
// Convert object to byte array
byte[] bytes = objectMapper.writeValueAsBytes(myObject);
эффект:предусмотреть Java 8 Поддержка классов времени, включая LocalDateTime、ZonedDateTime、Instant ждать.
Пример кода:
ObjectMapper objectMapper = new ObjectMapper()
.registerModule(new JavaTimeModule())
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
В приведенном выше коде используйте JavaTimeModule Зарегистрируйте модуль и включите Java 8 Поддержка классов времени.
эффект:предоставил JAX-RS В спецификации JSON Реализация конвертера сообщений, подходящего для Web Вернуться в приложении JSON Сценарии данных.
Пример кода:
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getMyObject() {
MyClass myObject = myService.getMyObject();
return Response.ok(myObject).build();
}
// Register JSON provider
register(JacksonJaxbJsonProvider.class);
Эти модули предоставляют богатые функции и возможности для удовлетворения потребностей различных сценариев. Пожалуйста, выберите соответствующий модуль в соответствии с конкретной ситуацией для использования.
Библиотека Джексона предоставляет некоторые точки расширения, которые позволяют пользователям расширять процедуру сериализации, середина поведения и опций. Ниже Некоторые часто используемые точки расширения:
эффект:для настройки Java объекти JSON Процесс преобразования данных.
код:
public class MyClassSerializer extends JsonSerializer<MyClass> {
@Override
public void serialize(MyClass value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
gen.writeStringField("my_property", value.getProperty());
gen.writeEndObject();
}
}
public class MyClassDeserializer extends JsonDeserializer<MyClass> {
@Override
public MyClass deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
JsonNode jsonNode = p.getCodec().readTree(p);
return new MyClass(jsonNode.get("my_property").asText());
}
}
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(MyClass.class, new MyClassSerializer());
module.addDeserializer(MyClass.class, new MyClassDeserializer());
objectMapper.registerModule(module);
эффект:Используется для преобразования типов.извыполнить,Может использоваться для настройки обработки аннотаций и других сценариев.
код:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Masked {
boolean value() default true;
}
public class MaskedStringConverter extends StdConverter<String, String> {
@Override
public String convert(String value) {
if (value == null) {
return null;
}
if (value.length() > 4) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < value.length(); i++) {
if (i < value.length() - 4) {
builder.append('*');
} else {
builder.append(value.charAt(i));
}
}
return builder.toString();
} else {
return value;
}
}
}
public class MaskedStringModifier extends BeanPropertyModifierBase {
@Override
public BeanPropertyDefinition updateBuilder(SerializationConfig config,
BeanDescription beanDesc,
BeanPropertyDefinition propDef) {
AnnotatedField field = propDef.getField();
if (field == null) {
return propDef;
}
Masked masked = field.getAnnotation(Masked.class);
if (masked == null || !masked.value()) {
return propDef;
}
return propDef.withSerializer(new StdDelegatingSerializer(new MaskedStringConverter()));
}
}
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.setSerializerModifier(new MaskedStringModifier());
objectMapper.registerModule(module);
эффект:используется для обеспечения настройкииз JsonNode Стратегия генерации объектов.
код:
JsonNodeFactory customNodeFactory = new JsonNodeFactory() {
@Override
public ObjectNode objectNode() {
return new CustomObjectNode(this);
}
};
class CustomObjectNode extends ObjectNode {
public CustomObjectNode(JsonNodeFactory nc) {
super(nc);
}
public CustomObjectNode(JsonNodeFactory nc, Map<String, JsonNode> m) {
super(nc, m);
}
@Override
public String toString() {
return "CustomObjectNode[" + super.toString() + "]";
}
}
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setNodeFactory(customNodeFactory);
эффект:разрешенопо умолчаниюиз JsonDeserializer и JsonSerializer Внесите изменения или замены.
код:
public class MyJsonSerializerModifier extends BeanSerializerModifier {
@Override
public JsonSerializer<?> modifySerializer(SerializationConfig config,
BeanDescription beanDesc,
JsonSerializer<?> serializer) {
if (beanDesc.getBeanClass() == MyClass.class) {
return new MyJsonSerializer();
}
return super.modifySerializer(config, beanDesc, serializer);
}
}
SimpleModule module = new SimpleModule();
module.setSerializerModifier(new MyJsonSerializerModifier());
objectMapper.registerModule(module);
эффект:для настройкиобъект Создать экземпляризлогика,Например, сипользовать фабричный метод или ожидание внедрения параметров конструктора.
код:
public class MyClassValueInstantiator extends ValueInstantiator.Base {
@Override
public Object createUsingDefault(DeserializationContext ctxt) throws IOException {
// Здесь можно добавить пользовательскую логику создания экземпляров.
return new MyClass();
}
}
SimpleModule module = new SimpleModule();
module.addValueInstantiator(MyClass.class, new MyClassValueInstantiator());
objectMapper.registerModule(module);
эффект:для настройкиобъектмежду уникальным идентификаторомиз Отображение отношений,Используется для обработки таких сценариев, как циклические ссылки.
код:
public class MyObjectIdResolver implements ObjectIdResolver {
// Способ реализации...
}
DefaultSerializerProvider.Impl sp = new DefaultSerializerProvider.Impl();
sp.setObjectIdResolver(new MyObjectIdResolver());
objectMapper.setSerializerProvider(sp);
эффект:используется для созданияобъектуникальный идентификатор(Object Id)。
код:
public class MyObjectIdentityGenerator extends ObjectIdentityGenerator<MyObject> {
// Способ реализации...
}
SimpleModule module = new SimpleModule();
module.setIdentityInfoGenerator(new MyObjectIdentityGenerator());
objectMapper.registerModule(module);
Эти точки расширения обеспечивают более высокий уровень возможностей настройки, позволяя пользователям иметь более детальный контроль над обратным процессом в соответствии с конкретными потребностями.
Навыки обновляются благодаря обмену ими, и каждый раз, когда я получаю новые знания, мое сердце переполняется радостью. Искренне приглашаем вас подписаться на публичный аккаунт 『
код тридцать пять
』 , для получения дополнительной технической информации.