Technologieaustausch

SpringBoot-Anmerkungen--11--@JSONField @JsonProperty

2024-07-12

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

Tipp: Nachdem der Artikel geschrieben wurde, kann das Inhaltsverzeichnis automatisch generiert werden. Informationen zur Generierung finden Sie im Hilfedokument auf der rechten Seite.


Eine Frage: Die Attribute, die mit isXXX in der Back-End-Entitätsklasse beginnen, werden nach der Übergabe an das Front-End automatisch entfernt.

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

Lösung:

  1. Ändern Sie den generierten isReceipt()-Methodennamen in getIsReceipt()
  2. Fügen Sie die Annotation @JsonProperty(value = „isXXX“) zur generierten Get-Methode, also isReceipt, hinzu.
 @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

Fügen Sie hier eine Bildbeschreibung ein

@JsonProperty und @JSONField

1. Einleitung

  • @JsonProperty- und @JSONField-Anmerkungen sind fürErsetzen Sie beim Konvertieren von obj in einen JSON-String den Attributnamen der Java-Bean durch den Zielattributnamen . Dies kommt häufig in Szenarien vor, in denen Eigenschaftsnamen beim Aufrufen von Schnittstellen von Drittanbietern inkonsistent sind.
  • Die Funktionen der beiden Annotationen sind gleich, sie stammen jedoch aus unterschiedlichen Quellen und werden auf unterschiedliche Weise verwendet. Die Gemeinsamkeiten und Unterschiede werden im Folgenden ausführlich erläutert!

2. Der Unterschied zwischen Anmerkungen

2.1 Das zugrunde liegende Framework ist unterschiedlich

  • @JsonProperty wird von Jackson implementiert
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • @JSONField wird von fastjson implementiert
         <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>版本号</version>
        </dependency>

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

2.2 Verschiedene Bereiche

Die Annotation @JSONproperty wird verwendet fürAttributeüber

  • Wenn Sie das trueName-Attribut in „Name“ serialisieren möchten, können Sie @JsonProperty(value="name") zum Attributnamen hinzufügen.

Die Annotation @JSONField kann verwendet werdenget, set und Propertiesüber

  • Um das trueName-Attribut in einen Namen zu serialisieren, können Sie @JSONField(value="name") zum get/set/property-Namen hinzufügen.

2.3 Gegenüberstellung von Vor- und Nachteilen

  1. Die Annotation @JSONField ist einfacher zu verwenden. Der Standardwert der Annotation ist derselbe wie der Eigenschaftsname, während @JsonProperty die manuelle Angabe des Eigenschaftsnamens erfordert.

  2. Die @JSONField-Annotation unterstützt weitere Attributzuordnungsoptionen, z. B. das Datumsformat während der Serialisierung, den Umgang mit Nullwerten usw.

  3. Die Leistung der @JSONField-Annotation ist schneller, da fastjson selbst eine leistungsstarke JSON-Verarbeitungsbibliothek ist

  4. Wenn Sie das Jackson-Framework verwenden, können Sie nur die Annotation @JsonProperty und nicht die Annotation @JSONField verwenden.

@JsonProperty

Wenn Sie ein neues verwendenSpringboot-Projekt, der Standardwert ist Jackson-Serialisierung, verwenden Sie einfach Anmerkungen direkt in den Eigenschaften.

1. Abhängigkeit

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • Die Annotation @JsonProperty stammt aus dem Jackson-Paket und wird mit der Methode ObjectMapper().writeValueAsString (Entitätsklasse) verwendet, um die Entitätsklasse in einen JSON-String zu konvertieren.
  • Wird mit der Methode ObjectMapper().readValue(string) verwendet, um JSON-Strings in Entitätsklassen zu konvertieren.

2. Testen Sie die Konvertierung zwischen JSON-String und Bean-Objekt

Entitätsklasse: 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

Testmethoden:

@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

Testergebnisse:

{"sex":"man","age":22,"JsonPropertyName":"zhangsan"}
User [name=zhangsan, sex=man, age=22]
  • 1
  • 2
  • Es ist ersichtlich, dass nach der Konvertierung der Bean in einen JSON-String der mit @JsonProperty annotierte Bean-Eigenschaftsname durch den angegebenen Eigenschaftsnamen ersetzt wurde: JsonPropertyName;

  • Nachdem der JSON-String in eine Bean konvertiert wurde, wurde der in der Annotation @JsonProperty angegebene Eigenschaftsname durch den Bean-Eigenschaftsnamen ersetzt: name;

@JSONField

1. Abhängigkeit

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • @JSONField befindet sich im Paket fastjson und wird mit der Methode JSON.toJSONString (Entitätsklasse) verwendet, um Entitätsklassen in JSON-Strings zu konvertieren.
  • Verwenden Sie es mit der Methode JSON.parseObject(string, entity class.class), um JSON-Strings in Entitätsklassen zu konvertieren.

2. Testen Sie die Konvertierung zwischen JSON-String und Bean-Objekt

Entitätsklasse: 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

Testmethoden:

@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

Testergebnisse:

{"JSONFieldName":"zhangsan","age":22,"sex":"man"}
User [name=zhangsan, sex=man, age=22]
  • 1
  • 2
  1. Es ist ersichtlich, dass nach der Konvertierung der Bean in einen JSON-String der Bean-Attributname der @JSONField-Annotation durch den angegebenen Attributnamen ersetzt wurde: JSONFieldName;
  2. Nachdem der JSON-String in eine Bean konvertiert wurde, wurde der durch die Annotation @JSONField angegebene Attributname durch den Bean-Attributnamen ersetzt: name;
  3. Die Testergebnisse sind die gleichen wie bei @JsonProperty.

Attribut 3.format

Das Formatattribut kann verwendet werden, um das Format von Datumstypattributen und das Format für die Konvertierung numerischer Typen in Zeichenfolgentypen anzugeben.

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
  • Im obigen Beispiel wird die Annotation @JSONField verwendet, um das Datumsformat des Geburtstagsattributs als „JJJJ-MM-TT“ anzugeben.
  • Das Zahlenformat des Gehaltsattributs ist „#,###.00“.

4. Attribut serialisieren

  • Mit dem Serialize-Attribut können Sie steuern, ob Attribute in JSON-Objekte serialisiert werden.
  • Wenn das Serialisierungsattribut „false“ ist, werden die Eigenschaften nicht in das JSON-Objekt serialisiert. Der Standardwert ist „true“.
public class User {
    @JSONField(serialize = false)
    private int userId;
    private String name;
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Im obigen Beispiel wird das userId-Attribut mithilfe der @JSONField-Annotation von der Serialisierung ausgeschlossen

5. Attribut deserialisieren

  • Mit dem Deserialize-Attribut kann gesteuert werden, ob die Eigenschaften im JSON-Objekt in das Java-Objekt deserialisiert werden.
  • Wenn das Deserialisierungsattribut „false“ ist, wird dieses Attribut nicht vom JSON-Objekt in das Java-Objekt deserialisiert. Der Standardwert ist „true“.
public class User {
    private int userId;
    private String name;
    @JSONField(deserialize = false)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Im obigen Beispiel wird die Alterseigenschaft mithilfe der Annotation @JSONField von der Deserialisierung ausgeschlossen

6. Ordinalattribut

Die Reihenfolge der Attribute kann über das Ordinalattribut angegeben werden

  • Standardmäßig basiert die Reihenfolge der Eigenschaften auf der Reihenfolge, in der die Eigenschaften im Java-Objekt erscheinen.
public class User {
    @JSONField(ordinal = 2)
    private String name;
    @JSONField(ordinal = 1)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Im obigen Beispiel wird die Annotation @JSONField verwendet, um anzugeben, dass die Reihenfolge des Altersattributs 1 und die Reihenfolge des Namensattributs 2 ist.

7.defaultValue-Attribut

Mit dem Attribut defaultValue kann der Standardwert des Attributs im Java-Objekt angegeben werden.

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

Im obigen Beispiel wird die Annotation @JSONField verwendet, um anzugeben, dass der Standardwert des userId-Attributs 0 und der Standardwert des name-Attributs „N/A“ ist.

8. Typattribut

  • Der Attributtyp kann über das Typattribut angegeben werden
public class User {
    private int userId;
    @JSONField(type = FieldType.STRING)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5

Im obigen Beispiel wird die Annotation @JSONField verwendet, um den Typ des Altersattributs als Zeichenfolgentyp anzugeben.