Partage de technologie

Annotations SpringBoot--11--@JSONField @JsonProperty

2024-07-12

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

Astuce : Une fois l'article rédigé, la table des matières peut être générée automatiquement. Pour savoir comment la générer, veuillez vous référer au document d'aide à droite.


Une question : les attributs commençant par isXXX dans la classe d'entité back-end sont automatiquement supprimés après avoir été transmis au front-end.

Insérer la description de l'image ici

Insérer la description de l'image ici
Insérer la description de l'image ici
Insérer la description de l'image ici
Insérer la description de l'image ici

Solution:

  1. Remplacez le nom de la méthode isReceipt() générée par getIsReceipt()
  2. Ajoutez l'annotation @JsonProperty(value = « isXXX ») à la méthode get générée, c'est-à-dire 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

Insérer la description de l'image ici

@JsonProperty et @JSONField

1. Introduction

  • Les annotations @JsonProperty et @JSONField sont destinéesLors de la conversion d'un obj en chaîne json, remplacez le nom de l'attribut du bean Java par le nom de l'attribut cible . Cela est courant dans les scénarios où les noms de propriétés sont incohérents lors de l’appel d’interfaces tierces.
  • Les fonctions des deux annotations sont les mêmes, mais elles proviennent de sources différentes et sont utilisées de différentes manières. Les similitudes et les différences seront expliquées en détail ci-dessous !

2. La différence entre les annotations

2.1 Le cadre sous-jacent est différent

  • @JsonProperty est implémenté par Jackson
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • @JSONField est implémenté par fastjson
         <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>版本号</version>
        </dependency>

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

2.2 Différentes portées

L'annotation @JSONproperty est utilisée pourLes attributsau-dessus de

  • Pour sérialiser l'attribut trueName en nom, vous pouvez ajouter @JsonProperty(value="name") au nom de l'attribut.

L'annotation @JSONField peut être utiliséeobtenir, définir et propriétésau-dessus de

  • Pour sérialiser l'attribut trueName en nom, vous pouvez ajouter @JSONField(value="name") au nom get/set/property.

2.3 Comparaison des avantages et des inconvénients

  1. L'annotation @JSONField est plus simple à utiliser. La valeur par défaut de l'annotation est la même que le nom de la propriété, tandis que @JsonProperty nécessite de spécifier manuellement le nom de la propriété.

  2. L'annotation @JSONField prend en charge davantage d'options de mappage d'attributs, telles que le format de date lors de la sérialisation, la gestion des valeurs nulles, etc.

  3. Les performances de l'annotation @JSONField sont plus rapides car fastjson lui-même est une bibliothèque de traitement JSON hautes performances

  4. Lorsque vous utilisez le framework Jackson, vous ne pouvez utiliser que l'annotation @JsonProperty et ne pouvez pas utiliser l'annotation @JSONField.

@JsonProperty

Si vous utilisez un nouveauprojet Springboot, la valeur par défaut est la sérialisation Jackson, utilisez simplement les annotations directement sur les propriétés.

1. Dépendance

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • L'annotation @JsonProperty provient du package jackson et est utilisée avec la méthode ObjectMapper().writeValueAsString (classe d'entité) pour convertir la classe d'entité en chaîne json.
  • Utilisé avec la méthode ObjectMapper().readValue(string) pour convertir les chaînes json en classes d'entités.

2. Testez la conversion entre la chaîne json et l'objet bean

Classe d'entité : 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

Méthodes d'essai:

@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

Résultats de test:

{"sex":"man","age":22,"JsonPropertyName":"zhangsan"}
User [name=zhangsan, sex=man, age=22]
  • 1
  • 2
  • On peut voir qu'une fois le bean converti en chaîne json, le nom de la propriété du bean annoté avec @JsonProperty a été remplacé par le nom de propriété spécifié : JsonPropertyName ;

  • Une fois la chaîne json convertie en bean, le nom de propriété spécifié par l'annotation @JsonProperty a été remplacé par le nom de propriété du bean : name;

@JSONField

1. Dépendance

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • @JSONField se trouve dans le package fastjson et est utilisé avec la méthode JSON.toJSONString (classe d'entité) pour convertir les classes d'entités en chaînes json.
  • Utilisez-le avec la méthode JSON.parseObject(string,entity class.class) pour convertir les chaînes json en classes d'entités.

2. Testez la conversion entre la chaîne json et l'objet bean

Classe d'entité : 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

Méthodes d'essai:

@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

Résultats de test:

{"JSONFieldName":"zhangsan","age":22,"sex":"man"}
User [name=zhangsan, sex=man, age=22]
  • 1
  • 2
  1. On peut voir qu'une fois le bean converti en chaîne json, le nom d'attribut du bean de l'annotation @JSONField a été remplacé par le nom d'attribut spécifié : JSONFieldName ;
  2. Une fois la chaîne json convertie en bean, le nom d'attribut spécifié par l'annotation @JSONField a été remplacé par le nom d'attribut du bean : name;
  3. Les résultats des tests sont les mêmes que ceux de @JsonProperty.

Attribut 3.format

L'attribut format peut être utilisé pour spécifier le format des attributs de type date et le format de conversion des types numériques en types chaîne.

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
  • Dans l'exemple ci-dessus, l'annotation @JSONField est utilisée pour spécifier le format de date de l'attribut anniversaire comme "aaaa-MM-jj".
  • Le format numérique de l'attribut de salaire est "#,###.00".

4. sérialiser l'attribut

  • Vous pouvez contrôler si les attributs sont sérialisés en objets JSON via l'attribut Serialize.
  • Lorsque l'attribut serialize est faux, les propriétés ne seront pas sérialisées dans l'objet JSON. La valeur par défaut est true.
public class User {
    @JSONField(serialize = false)
    private int userId;
    private String name;
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Dans l'exemple ci-dessus, l'attribut userId est exclu de la sérialisation à l'aide de l'annotation @JSONField

Attribut 5.deserialize

  • L'attribut deserialize peut être utilisé pour contrôler si les propriétés de l'objet JSON sont désérialisées en objets Java.
  • Lorsque l'attribut de désérialisation est faux, cet attribut ne sera pas désérialisé de l'objet JSON vers l'objet Java. La valeur par défaut est vraie.
public class User {
    private int userId;
    private String name;
    @JSONField(deserialize = false)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Dans l'exemple ci-dessus, la propriété age est exclue de la désérialisation à l'aide de l'annotation @JSONField

6.attribut ordinal

L'ordre des attributs peut être spécifié via l'attribut ordinal

  • Par défaut, l'ordre des propriétés est basé sur l'ordre dans lequel les propriétés apparaissent dans l'objet Java.
public class User {
    @JSONField(ordinal = 2)
    private String name;
    @JSONField(ordinal = 1)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Dans l'exemple ci-dessus, l'annotation @JSONField est utilisée pour spécifier l'ordre de l'attribut age sur 1 et l'ordre de l'attribut name sur 2.

7.attribut defaultValue

L'attribut defaultValue peut être utilisé pour spécifier la valeur par défaut de l'attribut dans l'objet 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

Dans l'exemple ci-dessus, l'annotation @JSONField est utilisée pour spécifier que la valeur par défaut de l'attribut userId est 0 et que la valeur par défaut de l'attribut name est "N/A".

8. attribut de type

  • Le type d'attribut peut être spécifié via l'attribut type
public class User {
    private int userId;
    @JSONField(type = FieldType.STRING)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5

Dans l'exemple ci-dessus, l'annotation @JSONField est utilisée pour spécifier le type de l'attribut age sous forme de type chaîne.