Обмен технологиями

Аннотации SpringBoot --11 --@JSONField @JsonProperty

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Совет: После написания статьи оглавление может быть сгенерировано автоматически. О том, как его создать, см. в справочном документе справа.


Вопрос: Атрибуты, начинающиеся с isXXX в классе внутренней сущности, автоматически удаляются после передачи во внешний интерфейс.

Вставьте сюда описание изображения

Вставьте сюда описание изображения
Вставьте сюда описание изображения
Вставьте сюда описание изображения
Вставьте сюда описание изображения

Решение:

  1. Измените имя сгенерированного метода isReceipt() на getIsReceipt().
  2. Добавьте аннотацию @JsonProperty(value = «isXXX») к сгенерированному методу get, то есть isReceipt.
 @JsonProperty(value = "isReceipt")
    public boolean isReceipt() {
        return isReceipt;
    }
    @JsonProperty(value = "isExamine")
    public boolean isExamine() {
        return isExamine;
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Вставьте сюда описание изображения

@JsonProperty и @JSONField

1. Введение

  • Аннотации @JsonProperty и @JSONField предназначены дляПри преобразовании obj в строку json замените имя атрибута Java-компонента именем целевого атрибута. . Это часто встречается в сценариях, где имена свойств несовместимы при вызове сторонних интерфейсов.
  • Функции двух аннотаций одинаковы, но они взяты из разных источников и используются по-разному. Сходства и различия будут подробно объяснены ниже!

2. Разница между аннотациями

2.1 Базовая структура отличается

  • @JsonProperty реализован Джексоном
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • @JSONField реализован с помощью fastjson
         <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>版本号</version>
        </dependency>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.2 Различные области применения

Аннотация @JSONproperty используется дляАтрибутывыше

  • Чтобы сериализовать атрибут trueName по имени, вы можете добавить @JsonProperty(value="name") к имени атрибута.

Можно использовать аннотацию @JSONField.получить, установить и свойствавыше

  • Чтобы сериализовать атрибут trueName в имя, вы можете добавить @JSONField(value="name") к имени get/set/property.

2.3 Сравнение преимуществ и недостатков

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

  2. Аннотация @JSONField поддерживает дополнительные параметры сопоставления атрибутов, например формат даты во время сериализации, обработку нулевых значений и т. д.

  3. Производительность аннотации @JSONField выше, поскольку fastjson сам по себе является высокопроизводительной библиотекой обработки JSON.

  4. При использовании платформы Джексона вы можете использовать только аннотацию @JsonProperty и не можете использовать аннотацию @JSONField.

@JsonProperty

Если вы используете новыйSpringboot проектпо умолчанию используется сериализация Джексона, просто используйте аннотации непосредственно в свойствах.

1. Зависимость

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • Аннотация @JsonProperty взята из пакета jackson и используется с методом ObjectMapper().writeValueAsString (класс сущности) для преобразования класса сущности в строку json.
  • Используется с методом ObjectMapper().readValue(string) для преобразования строк json в классы сущностей.

2. Проверьте преобразование между строкой json и объектом bean-компонента.

Класс сущности: User.java

import com.fasterxml.jackson.annotation.JsonProperty;
 
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
	@JsonProperty("JsonPropertyName")
	private String name;
	private String sex;
	private Integer age;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Методы тестирования:

@Test
public void testJsonProperty() throws IOException{
    //bean ---> json
	User user=new User("zhangsan","man",22);
	
	System.out.println(new ObjectMapper().writeValueAsString(user));
	

    //json ---> bean
	String str="{"sex":"man","age":22,"JsonPropertyName":"zhangsan"}";
	
	System.out.println(new ObjectMapper().readValue(str, User.class).toString());
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Результаты теста:

{"sex":"man","age":22,"JsonPropertyName":"zhangsan"}
User [name=zhangsan, sex=man, age=22]
  • 1
  • 2
  • Видно, что после преобразования bean-компонента в строку json имя свойства bean-компонента, аннотированное @JsonProperty, было заменено указанным именем свойства: JsonPropertyName;

  • После преобразования строки json в компонент имя свойства, указанное в аннотации @JsonProperty, заменяется именем свойства компонента: name;

@JSONField

1. Зависимость

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • @JSONField находится в пакете fastjson и используется с методом JSON.toJSONString (класс сущности) для преобразования классов сущностей в строки json.
  • Используйте его с методом JSON.parseObject(string,entity class.class) для преобразования строк json в классы сущностей.

2. Проверьте преобразование между строкой json и объектом bean-компонента.

Класс сущности: User.java

import com.alibaba.fastjson.annotation.JSONField;
 
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
	@JSONField(name="JSONFieldName")
	private String name;
	private String sex;
	private Integer age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Методы тестирования:

@Test
public void testSONField(){
    //bean ---> json
	User user=new User("zhangsan","man",22);
	System.out.println(JSON.toJSONString(user));
	
    //json ---> bean
	String str="{"JSONFieldName":"zhangsan","age":22,"sex":"man"}";
	System.out.println(JSON.parseObject(str, User.class).toString());	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Результаты теста:

{"JSONFieldName":"zhangsan","age":22,"sex":"man"}
User [name=zhangsan, sex=man, age=22]
  • 1
  • 2
  1. Видно, что после преобразования bean-компонента в строку json имя атрибута bean-компонента в аннотации @JSONField было заменено указанным именем атрибута: JSONFieldName;
  2. После преобразования строки json в компонент имя атрибута, указанное в аннотации @JSONField, заменяется именем атрибута компонента: name;
  3. Результаты теста такие же, как у @JsonProperty.

3. атрибут формата

Атрибут формата можно использовать для указания формата атрибутов типа даты и формата преобразования числовых типов в строковые типы.

public class User {
    private String name;
    private int age;
    @JSONField(format = "yyyy-MM-dd")
    private Date birthday;
    @JSONField(format = "#,###.00")
    private double salary;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • В приведенном выше примере аннотация @JSONField используется для указания формата даты атрибута дня рождения как «гггг-ММ-дд».
  • Числовой формат атрибута зарплаты: «#,###.00».

4. атрибут сериализации

  • Вы можете контролировать, сериализуются ли атрибуты в объекты JSON, с помощью атрибута сериализации.
  • Если атрибут сериализации имеет значение false, свойства не будут сериализованы в объект JSON. Значение по умолчанию — true.
public class User {
    @JSONField(serialize = false)
    private int userId;
    private String name;
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

В приведенном выше примере атрибут userId исключен из сериализации с помощью аннотации @JSONField.

5.десериализовать атрибут

  • Атрибут deserialize можно использовать для управления тем, десериализуются ли свойства объекта JSON в объекты Java.
  • Если атрибут десериализации имеет значение false, этот атрибут не будет десериализоваться из объекта JSON в объект Java. Значение по умолчанию — true.
public class User {
    private int userId;
    private String name;
    @JSONField(deserialize = false)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

В приведенном выше примере свойство age исключено из десериализации с помощью аннотации @JSONField.

6. порядковый атрибут

Порядок атрибутов можно указать с помощью порядкового атрибута.

  • По умолчанию порядок свойств зависит от порядка, в котором свойства появляются в объекте Java.
public class User {
    @JSONField(ordinal = 2)
    private String name;
    @JSONField(ordinal = 1)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

В приведенном выше примере аннотация @JSONField используется для указания порядка атрибута age как 1 и порядка атрибута name как 2.

7. Атрибут defaultValue

Атрибут defaultValue можно использовать для указания значения атрибута по умолчанию в объекте Java.

public class User {
    @JSONField(defaultValue = "0")
    private int userId;
    @JSONField(defaultValue = "N/A")
    private String name;
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

В приведенном выше примере аннотация @JSONField используется для указания того, что значение по умолчанию атрибута userId равно 0, а значение по умолчанию атрибута имени — «Н/Д».

8. тип атрибута

  • Тип атрибута можно указать через атрибут type.
public class User {
    private int userId;
    @JSONField(type = FieldType.STRING)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5

В приведенном выше примере аннотация @JSONField используется для указания типа атрибута age как строкового типа.