Kacang ini 'Negara':
public class State {
private boolean isSet;
@JsonProperty("isSet")
public boolean isSet() {
return isSet;
}
@JsonProperty("isSet")
public void setSet(boolean isSet) {
this.isSet = isSet;
}
}
dikirim melalui kawat menggunakan callback 'sukses' ajax:
success : function(response) {
if(response.State.isSet){
alert('success called successfully)
}
Apakah penjelasan @JsonProperty diperlukan di sini? Apa keuntungan menggunakannya? Saya pikir saya dapat menghapus anotasi ini tanpa menimbulkan efek samping.
Membaca tentang anosi ini di https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations Saya tidak tahu kapan ini harus digunakan?
Jawaban:
Ini contoh yang bagus. Saya menggunakannya untuk mengubah nama variabel karena JSON berasal dari
.Net
lingkungan di mana properti dimulai dengan huruf besar.Ini dengan benar mem-parsing ke / dari JSON:
sumber
@JsonProperty
anotasi.Double
? Saya hanya ingin tahu apakah jenisnya harusString
atau jenis apa saja yang didukung JSON? Mungkinkah itu tipe apa pun? @OldCurmudgeonSaya pikir OldCurmudgeon dan StaxMan keduanya benar tetapi di sini adalah satu jawaban kalimat dengan contoh sederhana untuk Anda.
@JsonProperty (nama), memberitahu Jackson ObjectMapper untuk memetakan nama properti JSON ke nama bidang Java yang dianotasi.
sumber
nah untuk apa nilainya sekarang ... JsonProperty juga JUGA digunakan untuk menentukan metode pengambil dan penyetel untuk variabel selain serialisasi dan deserialisasi biasa. Misalnya anggap Anda memiliki muatan seperti ini:
dan kelas Deserializer:
Maka dalam hal ini penjelasan JsonProperty diperlukan. Namun jika Anda juga memiliki metode di kelas
Lihat juga dokumentasi ini: http://fasterxml.github.io/jackson-annotations/javadoc/2.3.0/com/fasterxml/jackson/annotation/JsonProperty.html
sumber
Tanpa anotasi, nama properti yang disimpulkan (untuk mencocokkan dari JSON) akan menjadi "set", dan tidak - seperti yang tampaknya menjadi maksud - "isSet". Ini karena sesuai spesifikasi Java Beans, metode bentuk "isXxx" dan "setXxx" diambil untuk berarti bahwa ada properti logis "xxx" untuk dikelola.
sumber
Seperti yang Anda tahu, ini semua tentang cerita bersambung dan desalinize objek. Misalkan ada objek:
Serialisasi objek ini adalah:
Nama variabel langsung digunakan untuk membuat serialisasi data. Jika Anda akan menghapus api sistem dari implementasi sistem, dalam beberapa kasus, Anda harus mengganti nama variabel dalam serialisasi / deserialisasi. @JsonProperty adalah data meta untuk memberi tahu serializer cara objek serial. Ini digunakan untuk:
dari contoh:
sumber
Menambahkan JsonProperty juga memastikan keamanan jika seseorang memutuskan mereka ingin mengubah salah satu nama properti yang tidak menyadari kelas yang dimaksud akan diserialisasi ke objek Json. Jika mereka mengubah nama properti, JsonProperty memastikan itu akan digunakan dalam objek Json, dan bukan nama properti.
sumber
Selain jawaban lain,
@JsonProperty
anotasi sangat penting jika Anda menggunakan@JsonCreator
anotasi di kelas yang tidak memiliki konstruktor no-arg.Dalam contoh ini satu-satunya konstruktor ditandai sebagai
@JsonCreator
, oleh karena itu Jackson akan menggunakan konstruktor ini untuk membuat instance. Tetapi hasilnya seperti:Tetapi setelah penambahan
@JsonProperty
anotasi dalam konstruktor:Deserialisasi berhasil:
sumber
Selain semua jawaban di atas, jangan lupa bagian dari dokumentasi yang mengatakan
Jika Anda memiliki
non-static
metode di kelas Anda yang tidak konvensionalgetter or setter
maka Anda dapat membuatnya bertindak sepertigetter and setter
dengan menggunakan anotasi di atasnya. Lihat contoh di bawah iniKetika objek di atas diserialisasi, maka respons akan berisi
getUsername()
getId()
getIdAndUsername
*Karena metode ini
getIdAndUsername
dimulai denganget
maka itu diperlakukan sebagai pengambil normal maka, mengapa Anda bisa membuat anotasi dengan@JsonIgnore
.Jika Anda perhatikan bahwa
concatenateIdAndUsername
itu tidak dikembalikan dan itu karena namanya tidak dimulaiget
dan jika Anda ingin hasil metode itu dimasukkan dalam respons maka Anda dapat menggunakan@JsonProperty("...")
dan itu akan diperlakukan seperti biasagetter/setter
sebagaimana disebutkan dalam dokumentasi yang disorot di atas. .sumber
Dari JsonProperty javadoc,
sumber