Полный список аннотаций и точек расширения в сериализации и десериализации Джексона [Коллекция]
Полный список аннотаций и точек расширения в сериализации и десериализации Джексона [Коллекция]

1️⃣Часто используемые аннотации в Джексоне

1 @JsonSerialize и @JsonDeserialize

Используются для настройки операций во время сериализации и десериализации. Их функции следующие:

1.1 Аннотация @JsonSerialize

Используется для указания пользовательского сериализатора для преобразования объектов Java в строки JSON.

Вы можете указать используемый сериализатор, используя аннотацию @JsonSerialize на уровне свойства, метода получения или класса.

Это позволяет вам контролировать преобразование объектов в строки JSON, включая форматирование значений настраиваемых полей, преобразования типов и многое другое.

1.2 Аннотация @JsonDeserialize

Используется для указания пользовательского десериализатора для преобразования строки JSON в объект Java.

Вы можете указать используемый десериализатор, используя аннотацию @JsonDeserialize на уровне свойства, метода установки или класса.

Это дает вам контроль над преобразованием строк JSON в объекты, включая обработку специальных форматов, преобразование типов и многое другое.

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

2 @JsonProperty

Функция: указывает имя атрибута, используемое во время сериализации и десериализации JSON.

код Язык:javascript
копировать
public class MyClass {
    @JsonProperty("customName")
    private String property;
    // Getter and Setter methods
}
3 @JsonIgnore

Функция: предписывает Джексону игнорировать аннотированные свойства во время сериализации и десериализации.

код Язык:javascript
копировать
public class MyClass {
    @JsonIgnore
    private String property;
    // Getter and Setter methods
}
4 @JsonFormat

Используется для указания того, как форматируются специальные типы полей, такие как даты и время, при сериализации или десериализации объектов Java в строки JSON или из них. Его функция — управлять форматом сериализации и десериализации специальных типов полей, таких как дата и время.

Вот некоторые распространенные варианты использования аннотации @JsonFormat:

4.1 Формат даты

Вы можете использовать аннотацию @JsonFormat, чтобы указать формат поля даты при сериализации в строку JSON и формат при десериализации из строки JSON в объект Java.

код Язык:javascript
копировать
import com.fasterxml.jackson.annotation.JsonFormat;

public class Event {
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date eventDate;

    // Опустить конструктор и методы получения/установки.
}

В приведенном выше примере мы указали, что поле eventDate использует формат даты «гггг-ММ-дд» при сериализации и десериализации.

4.2 Время форматирования

Помимо дат вы также можете использовать аннотацию @JsonFormat, чтобы указать, как форматируются поля времени.

код Язык:javascript
копировать
import com.fasterxml.jackson.annotation.JsonFormat;

public class Meeting {
    @JsonFormat(pattern = "HH:mm:ss")
    private LocalTime startTime;

    // Опустить конструктор и методы получения/установки.
}

В этом примере мы указываем, что поле startTime принимает формат времени «ЧЧ:мм:сс» при сериализации и десериализации.

4.3 Другие параметры форматирования

Помимо атрибута шаблона, аннотация @JsonFormat также поддерживает другие атрибуты, такие как часовой пояс, форма и т. д., для более детального управления поведением сериализации и десериализации полей.

код Язык:javascript
копировать
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.

5 @JsonUnwrapped

Когда используется аннотация @JsonUnwrapped, она играет следующие роли во время сериализации и десериализации:

5.1 Сериализация

Во время процесса сериализации аннотация @JsonUnwrapped сообщает библиотеке Джексона объединить свойства вложенного объекта с внешним объектом, включая таким образом свойства вложенного объекта непосредственно в сгенерированные данные JSON. Это уменьшает иерархию результирующей структуры JSON, делая ее более плоской.

5.2 Десериализация

Во время процесса десериализации аннотация @JsonUnwrapped сообщает библиотеке Джексона извлечь указанное значение свойства из данных JSON и заполнить его в соответствующее свойство внешнего объекта. Это позволяет напрямую сопоставлять плоскую структуру данных JSON со свойствами внешнего объекта, упрощая логику кода для обработки вложенных структур.

Ниже приведен пример использования аннотации @JsonUnwrapped:

Рассмотрим класс Java с именем «Сотрудник», который содержит вложенные объекты «Адрес»:

код Язык:javascript
копировать
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;
    // Опустить конструктор и методы получения/установки.
}

Если у вас есть объект «Сотрудник» с именем «Сотрудник»:

код Язык:javascript
копировать
Employee employee = new Employee("John Doe", new Address("New York", "123 Main St"));

При сериализации объект сотрудника будет преобразован в следующую структуру JSON:

код Язык:javascript
копировать
{
  "name": "John Doe",
  "city": "New York",
  "street": "123 Main St"
}

При десериализации следующие данные JSON:

код Язык:javascript
копировать
{
  "name": "Jane Smith",
  "city": "San Francisco",
  "street": "456 Elm St"
}

Будет преобразован в объект «Сотрудник», содержащий соответствующие свойства.

В дополнение к базовому использованию аннотация @JsonUnwrapped также поддерживает некоторые атрибуты, такие как префикс и суффикс, которые используются для управления тем, будут ли развернутые свойства иметь префикс или суффикс при слиянии с внешним объектом.

код Язык:javascript
копировать
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 более кратким и интуитивно понятным.

6 @JsonAnyGetter

Функция: используется для вывода свойств объекта в виде карты в виде пар ключ-значение, включая динамические свойства. Включите динамические свойства в JSON в виде пар ключ-значение.

Пример кода:

код Язык:javascript
копировать
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.

7 @JsonInclude

Используется для управления обработкой нулевых значений свойств во время сериализации. Его цель — указать, включаются ли поля с нулевыми значениями атрибутов при преобразовании объекта в строку JSON.

Аннотация @JsonInclude может применяться на уровне класса или на уровне свойства.

7.1 Аннотация @JsonInclude на уровне класса

При применении на уровне класса аннотация @JsonInclude указывает стратегию обработки значений NULL по умолчанию, которая будет применяться ко всем свойствам всего класса.

Установив атрибут value @JsonInclude, вы можете указать нулевую стратегию обработки во время сериализации. К часто используемым значениям относятся:

Include.ALWAYS:Всегда содержит значения атрибутов null поле.

Include.NON_NULL:Содержит только значения атрибутов, которые не являются null поле.

Include.NON_EMPTY:Содержит только значения атрибутов, которые не являются null И не пустое (типа пустое нить, пустой набор) поле.

Include.USE_DEFAULTS:использоватьпо умолчаниюиз null стратегии обработки.

7.2 Аннотация @JsonInclude на уровне свойства

При применении на уровне свойства @JsonInclude Аннотации могут переопределять настройки по умолчанию на уровне класса. null стратегию обработки, определяющую независимую null стратегии обработки.

Установив атрибут значения @JsonInclude, вы можете указать нулевую стратегию обработки для этого атрибута во время сериализации. Значение совпадает с аннотацией уровня класса.

Вот пример, демонстрирующий, как использовать аннотацию @JsonInclude:

код Язык:javascript
копировать
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 и был проигнорирован.

8 @JsonAlias

эффект:Укажите атрибутыиз Псевдоним,Измените псевдоним на Свойства включения в обратной сериализации.

Пример кода:

код Язык:javascript
копировать
public class MyClass {
    @JsonAlias({"name", "fullName"})
    private String property;
    // Getter and Setter methods
}

В приведенном выше коде используйте @JsonAlias В аннотации указано name и fullName Эти два псевдонима, когда JSON Когда эти два ключа будут включены в данные, они будут связаны с property Свойства отображены.

9 @JsonIgnoreProperties

эффект:указано всериализацияипротивоположныйсериализацияпроцесссерединанужно игнорироватьизсвойство。

Пример кода:

код Язык:javascript
копировать
@JsonIgnoreProperties({"property1", "property2"})
public class MyClass {
    private String property1;
    private String property2;
    private String property3;
    // Getter and Setter methods
}

В приведенном выше коде используйте @JsonIgnoreProperties В аннотации указаноигнорировать property1 и property2 Эти два свойства игнорируются в процедуре сериализации и антисериализации середина.

10 @JsonManagedReference и @JsonBackReference

эффект:Используется для разрешения циклических ссылок.извопрос,То есть между определенным объектом и другим объектом существуют взаимные ссылки.

Пример кода:

код Язык:javascript
копировать
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 используется для аннотирования ссылки на родительский объект в дочернем объекте. Это предотвращает проблемы бесконечной рекурсии, вызванные циклическими ссылками.

11 @JsonCreator

эффект:существоватьпротивоположныйсериализацияпроцесссередина,Используется для указания статического фабричного метода или конструктора.,Используется для создания экземпляров объектов.

Пример кода:

код Язык:javascript
копировать
public class MyClass {
    private String property;

    @JsonCreator
    public MyClass(@JsonProperty("property") String property) {
        this.property = property;
    }
    // Getter method for property
}

В приведенном выше коде используйте @JsonCreator Аннотация аннотирует конструктор и передает @JsonProperty Указанные атрибуты и JSON Поля сопоставлены.

12 @JsonTypeInfo

эффект:существоватьсериализацияипротивоположныйсериализацияпроцесссередина,Используется для обработки полиморфных типов.

Пример кода:

код Язык:javascript
копировать
@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 Аннотации отмечают производные классы и соответствующие им идентификаторы типов.

13 @JsonFilter

Используется для динамической фильтрации свойств для включения во время сериализации. Он позволяет динамически указывать свойства для сериализации во время выполнения, что очень полезно в определенных сценариях, например, при принятии решения о том, что сериализовать, на основе разрешений пользователя или других условий.

13.1 Определение фильтров с помощью аннотации @JsonFilter

Во-первых, вам нужно определить фильтр, присвоив ему имя, и применить его к классам, которым требуется динамическая фильтрация.

код Язык:javascript
копировать
import com.fasterxml.jackson.annotation.JsonFilter;

@JsonFilter("myFilter")
public class MyDto {
    private String name;
    private int age;
    private String email;
    
    // Опустить конструктор и методы получения/установки.
}

В приведенном выше примере мы определили фильтр с именем «myFilter» для класса MyDto, используя аннотацию @JsonFilter.

13.2 Настройка ObjectMapper для использования фильтров

Далее вам необходимо настроить ObjectMapper для использования этого фильтра.

код Язык:javascript
копировать
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” Два атрибута.

13.3 Применение фильтров для сериализации

Наконец, при сериализации вы можете указать используемый фильтр.

код Язык:javascript
копировать
String json = mapper.writer(filterProvider).writeValueAsString(myDto);

В этом примере мы используем фильтр, настроенный ObjectMapper Объект придет myDto Объект сериализуется как JSON нить. Во время сериализации только “name” и “age” Два атрибута, потому что мы указали это Два в фильтре середина атрибута.

Используя аннотацию @JsonFilter, вы можете динамически фильтровать атрибуты, подлежащие сериализации, и гибко управлять результатами сериализации в соответствии с вашими потребностями. Это очень полезно для создания гибких API-интерфейсов RESTful или управления динамическим контролем разрешений.

14 @JsonAnySetter

эффект:Позволяет сопоставить несовпадающее с конкретнымполе Пары ключ-значение динамически вводятся в Java в объекте.

Пример кода:

код Язык:javascript
копировать
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 несовпадающие пары ключ-значение будут вставлены в поле дополнительных свойств.

15 @JsonAppend

эффект:Разрешить пользователямсуществоватьсериализациядинамически добавленосвойствоприезжать JSON Объект, эти свойства могут происходить из Java Различные поля или методы объекта.

Пример кода:

код Язык:javascript
копировать
@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 предоставляет два способа динамического добавления виртуальных полей.

  • 1 attrs Этот метод требует, чтобы вы вручную добавляли атрибут при сериализации, как показано ниже. om.writerFor(CombineJacksonAnnotation.JsonPropertyPojo.class).withAttribute(“age”,“10”).withAttribute(“height”,“12”)
  • 2 props Этот метод более гибкий, но для его реализации достаточно реализовать только класс VirtualBeanPropertyWriter. Если у вас действительно есть такая необходимость, для ее реализации рекомендуется использовать второй метод.
16 @JsonIgnoreType

эффект: инструктировать Jackson В процессе сериализации и антисериализации середина игнорируется типом аннотацияиз. Это значит быть @JsonIgnoreType Аннотированный тип будет полностью проигнорирован и не будет включен в окончательный сгенерированный файл. JSON , не будет использоваться для десериализации.

Обычно @JsonIgnoreType аннотации будут использоваться для некоторых вспомогательных изданий, не обязательно должны быть типа сериализации или анти-сериализации, или каких-либо других JSON Независимые от взаимодействия типы. Используя @JsonIgnoreType аннотация, вы можете сказать Jackson Игнорируйте эти типы, чтобы избежать JSON сериализации, процесс обратной сериализации середина обрабатывает их.

код Язык:javascript
копировать
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 объект.

17 @JsonGetter и @JsonSetter

эффект: Используется для указания процесса сериализации и обратной сериализации. JSON Правила именования атрибутов и методы чтения и записи пользовательских атрибутов. Их эффект заключается в следующем:

17.1 Аннотация @JsonGetter
  • 1) Используется для указания нестандартного метода получения в качестве метода чтения атрибутов JSON.
  • 2) по нестандартному getter Использовать метод @JsonGetter аннотации, можно указать, что данный метод соответствует из JSON Название объекта недвижимости.
  • 3) Это позволяет вам Java Атрибут объектсерединаиз сопоставляется с другим именем атрибута из JSON свойства, что позволяет более гибко называть свойства.
17.2 Аннотация @JsonSetter
  • 1) Используется для указания нестандартного метода установки в качестве метода записи атрибутов JSON.
  • 2)по нестандартному setter Использовать метод @JsonSetter аннотации, можно указать, что данный метод соответствует из JSON Название объекта недвижимости.
  • 3) Это позволяет вам JSON Значение атрибута в сопоставлении с именем атрибута, отличным от имени Java атрибут объекта, тем самым достигая более гибкого назначения атрибутов.
код Язык:javascript
копировать
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 Свойства: правила именования и пользовательские атрибуты, а также методы чтения и записи.

18 @JsonPropertyOrder

эффект: В общем java pojo Объект сериализуется в json строка, используйте @JsonPropertyOrder Свойства можно указать в json порядок в строке

2️⃣Модули в библиотеке Джексона

Вот некоторые из наиболее часто используемых модулей библиотеки Джексона:

2.1 databind

эффект:предоставил JSON основная функция сериализации и антисериализации, вы можете Java объекти JSON Преобразование данных.

Пример кода:

код Язык:javascript
копировать
ObjectMapper objectMapper = new ObjectMapper();
MyClass myObject = objectMapper.readValue(json, MyClass.class);
String json = objectMapper.writeValueAsString(myObject);
2.2 annotations

эффект:предоставилсерияаннотация,Варианты управления поведением процесса сериализации и антисериализации серединаизи.

Пример кода:

код Язык:javascript
копировать
public class MyClass {
    @JsonProperty("my_property")
    private String property;
    // Getter and Setter methods
}
2.3 coreutils

эффект:Предоставьте некоторые основные инструментыифункция,Используется для поддержки процедуры сериализации и анти-сериализации, необходимой для преобразования типов и других операций.

Пример кода:

код Язык:javascript
копировать
// 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);
2.4 datatype-jsr310

эффект:предусмотреть Java 8 Поддержка классов времени, включая LocalDateTime、ZonedDateTime、Instant ждать.

Пример кода:

код Язык:javascript
копировать
ObjectMapper objectMapper = new ObjectMapper()
    .registerModule(new JavaTimeModule())
    .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

В приведенном выше коде используйте JavaTimeModule Зарегистрируйте модуль и включите Java 8 Поддержка классов времени.

2.5 jaxrs-json-provider

эффект:предоставил JAX-RS В спецификации JSON Реализация конвертера сообщений, подходящего для Web Вернуться в приложении JSON Сценарии данных.

Пример кода:

код Язык:javascript
копировать
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getMyObject() {
    MyClass myObject = myService.getMyObject();
    return Response.ok(myObject).build();
}

// Register JSON provider
register(JacksonJaxbJsonProvider.class);

Эти модули предоставляют богатые функции и возможности для удовлетворения потребностей различных сценариев. Пожалуйста, выберите соответствующий модуль в соответствии с конкретной ситуацией для использования.

3️⃣ Точки расширения библиотеки Джексона

Библиотека Джексона предоставляет некоторые точки расширения, которые позволяют пользователям расширять процедуру сериализации, середина поведения и опций. Ниже Некоторые часто используемые точки расширения:

3.1 JsonSerializer и JsonDeserializer

эффект:для настройки Java объекти JSON Процесс преобразования данных.

код

код Язык:javascript
копировать
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);
3.2 StdConverter

эффект:Используется для преобразования типов.извыполнить,Может использоваться для настройки обработки аннотаций и других сценариев.

код

код Язык:javascript
копировать
@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);
3.3 JsonNodeFactory

эффект:используется для обеспечения настройкииз JsonNode Стратегия генерации объектов.

код

код Язык:javascript
копировать
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);
3.4 JsonDeserializerModifier и JsonSerializerModifier

эффект:разрешенопо умолчаниюиз JsonDeserializer и JsonSerializer Внесите изменения или замены.

код

код Язык:javascript
копировать
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);
3.5 ValueInstantiator

эффект:для настройкиобъект Создать экземпляризлогика,Например, сипользовать фабричный метод или ожидание внедрения параметров конструктора.

код

код Язык:javascript
копировать
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);
3.6 ObjectIdResolver

эффект:для настройкиобъектмежду уникальным идентификаторомиз Отображение отношений,Используется для обработки таких сценариев, как циклические ссылки.

код

код Язык:javascript
копировать
public class MyObjectIdResolver implements ObjectIdResolver {
    // Способ реализации...
}

DefaultSerializerProvider.Impl sp = new DefaultSerializerProvider.Impl();
sp.setObjectIdResolver(new MyObjectIdResolver());
objectMapper.setSerializerProvider(sp);
3.7 ObjectIdentityGenerator

эффект:используется для созданияобъектуникальный идентификатор(Object Id)。

код

код Язык:javascript
копировать
public class MyObjectIdentityGenerator extends ObjectIdentityGenerator<MyObject> {
    // Способ реализации...
}

SimpleModule module = new SimpleModule();
module.setIdentityInfoGenerator(new MyObjectIdentityGenerator());
objectMapper.registerModule(module);

Эти точки расширения обеспечивают более высокий уровень возможностей настройки, позволяя пользователям иметь более детальный контроль над обратным процессом в соответствии с конкретными потребностями.


Навыки обновляются благодаря обмену ими, и каждый раз, когда я получаю новые знания, мое сердце переполняется радостью. Искренне приглашаем вас подписаться на публичный аккаунт код тридцать пять , для получения дополнительной технической информации.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose