Apakah mungkin: untuk memiliki satu bidang di kelas, tetapi nama yang berbeda untuk itu selama serialisasi / deserialisasi di perpustakaan Jackson?
Sebagai contoh, saya memiliki kelas "Coordiantes".
class Coordinates{
int red;
}
Untuk deserialisasi dari JSON ingin memiliki format seperti ini:
{
"red":12
}
Tetapi ketika saya akan membuat serial objek, hasilnya harus seperti ini:
{
"r":12
}
Saya mencoba menerapkan ini dengan menerapkan @JsonProperty
anotasi pada pengambil dan penyetel (dengan nilai yang berbeda):
class Coordiantes{
int red;
@JsonProperty("r")
public byte getRed() {
return red;
}
@JsonProperty("red")
public void setRed(byte red) {
this.red = red;
}
}
tapi saya mendapat pengecualian:
org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Bidang tidak dikenal "merah"
Anda dapat menggunakan
@jsonAlias
yang diperkenalkan di jackson 2.9.0Contoh:
Ini menggunakan
r
selama serialisasi, tetapi memungkinkanred
sebagai alias selama deserialisasi. Ini masih memungkinkanr
untuk deserialized juga.sumber
has no effect during serialization where primary name is always used
. Ini bukan yang diinginkan OP.r
sebagai nama utama, tetapired
untuk@JsonAlias
, yang memungkinkan untuk membuat serialisasir
, tetapi menambahred
diakui pada deserialization. Membubuhi keterangan dengan@JsonProperty("r")
dan juga@JsonAlias("red")
akan berfungsi dengan baik untuk masalah yang diberikan.Anda dapat menggunakan kombinasi @JsonSetter , dan @JsonGetter untuk masing-masing mengontrol deserialisasi, dan serialisasi properti Anda. Ini juga akan memungkinkan Anda untuk menjaga nama metode metode pengambil dan penyetel standar yang sesuai dengan nama bidang Anda yang sebenarnya.
sumber
Saya akan mengikat dua pasangan getter / setter berbeda ke satu variabel:
sumber
@JsonGetter
dan@JsonSetter
. Jadi orang dapat dengan tepat mengatur bagaimana serializer akan berperilaku.Mungkin saja memiliki pasangan pengambil / penyetel normal. Anda hanya perlu menentukan mode akses di
@JsonProperty
Berikut ini adalah unit test untuk itu:
Saya mendapatkan output sebagai berikut:
sumber
Ini bukan yang saya harapkan sebagai solusi (meskipun ini adalah kasus penggunaan yang sah). Persyaratan saya adalah mengizinkan klien kereta yang ada (aplikasi seluler yang sudah dirilis) menggunakan nama alternatif.
Solusinya terletak pada penyediaan metode penyetel terpisah seperti ini:
sumber
Saya tahu ini pertanyaan lama, tetapi bagi saya saya membuatnya berfungsi ketika saya menemukan bahwa itu bertentangan dengan pustaka Gson jadi jika Anda menggunakan Gson maka gunakanlah
@SerializedName("name")
alih-alih@JsonProperty("name")
harap ini membantusumber
Penjelasan dengan
@JsonAlias
yang diperkenalkan dengan Jackson 2.9+, tanpa menyebutkan@JsonProperty
item yang akan di-deserialisasi dengan lebih dari satu alias (nama berbeda untuk properti json) berfungsi dengan baik.Saya menggunakan
com.fasterxml.jackson.annotation.JsonAlias
konsistensi paket dengancom.fasterxml.jackson.databind.ObjectMapper
use case saya.Untuk misalnya:
hanya bekerja dengan baik.
sumber
Mereka harus memasukkan ini sebagai fitur, karena sekarang pengaturan yang berbeda
@JsonProperty
untuk pengambil dan penyetel menghasilkan apa yang Anda harapkan (nama properti berbeda selama serialisasi dan deserialisasi untuk bidang yang sama). Jackson versi 2.6.7sumber
Anda dapat menulis kelas serial untuk melakukannya:
sumber