Berbagi teknologi

Anotasi SpringBoot--11--@JSONField @JsonProperty

2024-07-12

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

Tip: Setelah artikel ditulis, daftar isi dapat dibuat secara otomatis. Untuk cara menghasilkannya, silakan lihat dokumen bantuan di sebelah kanan.


Sebuah pertanyaan: Atribut yang dimulai dengan isXXX di kelas entitas back-end secara otomatis dihapus setelah diteruskan ke front-end.

Masukkan deskripsi gambar di sini

Masukkan deskripsi gambar di sini
Masukkan deskripsi gambar di sini
Masukkan deskripsi gambar di sini
Masukkan deskripsi gambar di sini

Larutan:

  1. Ubah nama metode isReceipt() yang dihasilkan menjadi getIsReceipt()
  2. Tambahkan anotasi @JsonProperty(value = “isXXX”) ke metode get yang dihasilkan, yaitu 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

Masukkan deskripsi gambar di sini

@JsonProperty dan @JSONField

1. Perkenalan

  • Anotasi @JsonProperty dan @JSONField ditujukan untukSaat mengonversi obj ke string json, ganti nama atribut java bean dengan nama atribut target . Hal ini umum terjadi ketika nama properti tidak konsisten saat memanggil antarmuka pihak ketiga.
  • Fungsi kedua anotasi tersebut sama, namun berasal dari sumber yang berbeda dan digunakan dengan cara yang berbeda. Persamaan dan perbedaannya akan dijelaskan secara detail di bawah ini!

2. Perbedaan antara anotasi

2.1 Kerangka dasarnya berbeda

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

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

2.2 Cakupan yang berbeda

Anotasi @JSONproperty digunakan untukAtributdi atas

  • Untuk membuat serial atribut trueName menjadi nama, Anda dapat menambahkan @JsonProperty(value="name") ke nama atribut.

Anotasi @JSONField dapat digunakandapatkan, atur, dan propertidi atas

  • Untuk membuat serial atribut trueName menjadi nama, Anda dapat menambahkan @JSONField(value="name") ke nama get/set/property.

2.3 Perbandingan kelebihan dan kekurangan

  1. Anotasi @JSONField lebih mudah digunakan. Nilai default anotasi sama dengan nama properti, sedangkan @JsonProperty memerlukan penentuan nama properti secara manual.

  2. Anotasi @JSONField mendukung lebih banyak opsi pemetaan atribut, seperti format tanggal selama serialisasi, cara menangani nilai null, dll.

  3. Performa anotasi @JSONField lebih cepat karena fastjson sendiri merupakan pustaka pemrosesan JSON berperforma tinggi

  4. Saat menggunakan kerangka Jackson, Anda hanya dapat menggunakan anotasi @JsonProperty dan tidak dapat menggunakan anotasi @JSONField.

@PropertiJson

Jika Anda menggunakan yang baruproyek boot musim semi, defaultnya adalah serialisasi Jackson, cukup gunakan anotasi langsung di properti.

1. Ketergantungan

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • Anotasi @JsonProperty berasal dari paket jackson dan digunakan dengan metode ObjectMapper().writeValueAsString (kelas entitas) untuk mengonversi kelas entitas menjadi string json.
  • Digunakan dengan metode ObjectMapper().readValue(string) untuk mengonversi string json menjadi kelas entitas.

2. Uji konversi antara string json dan objek bean

Kelas entitas: 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

Metode tes:

@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

Hasil tes:

{"sex":"man","age":22,"JsonPropertyName":"zhangsan"}
User [name=zhangsan, sex=man, age=22]
  • 1
  • 2
  • Terlihat bahwa setelah bean diubah menjadi string json, nama properti bean yang dianotasi dengan @JsonProperty telah diganti dengan nama properti yang ditentukan: JsonPropertyName;

  • Setelah string json diubah menjadi bean, nama properti yang ditentukan oleh anotasi @JsonProperty telah diganti dengan properti bean name: name;

@LapanganJSON

1. Ketergantungan

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • @JSONField terletak di paket fastjson dan digunakan dengan metode JSON.toJSONString (kelas entitas) untuk mengubah kelas entitas menjadi string json.
  • Gunakan dengan metode JSON.parseObject(string, entitas class.class) untuk mengonversi string json menjadi kelas entitas.

2. Uji konversi antara string json dan objek bean

Kelas entitas: 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

Metode tes:

@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

Hasil tes:

{"JSONFieldName":"zhangsan","age":22,"sex":"man"}
User [name=zhangsan, sex=man, age=22]
  • 1
  • 2
  1. Terlihat bahwa setelah bean diubah menjadi string json, nama atribut bean dari anotasi @JSONField telah diganti dengan nama atribut yang ditentukan: JSONFieldName;
  2. Setelah string json diubah menjadi bean, nama atribut yang ditentukan oleh anotasi @JSONField telah diganti dengan atribut bean name: name;
  3. Hasil tesnya sama dengan @JsonProperty.

3.atribut format

Atribut format dapat digunakan untuk menentukan format atribut tipe tanggal dan format konversi tipe numerik menjadi tipe string.

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
  • Dalam contoh di atas, anotasi @JSONField digunakan untuk menentukan format tanggal atribut ulang tahun sebagai "yyyy-MM-dd"
  • Format angka atribut gaji adalah "#,###.00"

4. atribut serialisasi

  • Anda dapat mengontrol apakah atribut diserialkan ke dalam objek JSON melalui atribut serialize.
  • Jika atribut serialize salah, properti tidak akan diserialkan ke objek JSON. Defaultnya adalah true.
public class User {
    @JSONField(serialize = false)
    private int userId;
    private String name;
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Dalam contoh di atas, atribut userId dikecualikan dari serialisasi menggunakan anotasi @JSONField

5. deserialisasi atribut

  • Atribut deserialize dapat digunakan untuk mengontrol apakah properti di objek JSON dideserialisasi menjadi objek Java.
  • Jika atribut deserialize salah, atribut ini tidak akan dideserialisasi dari objek JSON ke objek Java. Defaultnya adalah true.
public class User {
    private int userId;
    private String name;
    @JSONField(deserialize = false)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Dalam contoh di atas, properti age dikecualikan dari deserialisasi menggunakan anotasi @JSONField

6.atribut ordinal

Urutan atribut dapat ditentukan melalui atribut ordinal

  • Secara default, urutan properti didasarkan pada urutan kemunculan properti di objek Java.
public class User {
    @JSONField(ordinal = 2)
    private String name;
    @JSONField(ordinal = 1)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Dalam contoh di atas, anotasi @JSONField digunakan untuk menentukan urutan atribut age sebagai 1 dan urutan atribut name sebagai 2.

7. atribut Nilai Default

Atribut defaultValue dapat digunakan untuk menentukan nilai default atribut di objek 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

Dalam contoh di atas, anotasi @JSONField digunakan untuk menentukan bahwa nilai default atribut userId adalah 0 dan nilai default atribut name adalah "N/A"

8. ketik atribut

  • Tipe atribut dapat ditentukan melalui atribut type
public class User {
    private int userId;
    @JSONField(type = FieldType.STRING)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5

Dalam contoh di atas, anotasi @JSONField digunakan untuk menentukan tipe atribut age sebagai tipe string.