Cara mengubah nama bidang di JSON menggunakan Jackson


169

Saya menggunakan jackson untuk mengubah objek saya menjadi json. Objek memiliki 2 bidang:

@Entity
public class City {
   @id
   Long id;
   String name;
   public String getName() { return name; }
   public void setName(String name){ this.name = name; }
   public Long getId() { return id; }
   public void setName(Long id){ this.id = id; }
}

Karena saya ingin menggunakan ini dengan fitur lengkap otomatis jQuery, saya ingin 'id' muncul sebagai 'nilai' di json dan 'nama' muncul sebagai 'label'. Dokumentasi jackson tidak jelas mengenai hal ini dan saya sudah mencoba setiap anotasi yang bahkan tampak seperti itu memang melakukan apa yang saya butuhkan tetapi saya tidak bisa nametampil seperti labeldan idtampil seperti valuedi json.

Adakah yang tahu bagaimana melakukan ini atau jika ini memungkinkan?


jika Jika Anda akan berpotensi menggunakan entitas ("Kota") untuk tujuan lain atau logika bisnis, saya akan menghindari mendefinisikan representasi JSON sebagai Label & Nilai. OTOH jika ini adalah data referensi murni yang digunakan untuk kombo, Anda kemungkinan akan memiliki lebih banyak - membuat entitas generik (Pair atau Opsi) untuk mencakup semua ini adalah pendekatan yang mungkin untuk dipertimbangkan.
Thomas W

Jawaban:


323

Sudahkah Anda mencoba menggunakan @JsonProperty?

@Entity
public class City {
   @id
   Long id;
   String name;

   @JsonProperty("label")
   public String getName() { return name; }

   public void setName(String name){ this.name = name; }

   @JsonProperty("value")
   public Long getId() { return id; }

   public void setId(Long id){ this.id = id; }
}

5
Ya, saya sudah mencobanya, namun saya lakukan @JsonProperty(value="label")dan tidak berhasil, saya sudah mencobanya seperti yang Anda sarankan dan berhasil! Terima kasih pria ini akan sangat membantu menyederhanakan kode sekarang.
Ali

Saya memiliki persyaratan serupa. Hanya saja saya menggunakan Jackson dengan RESTEasy dan ini tidak berhasil: - / Aneh!
Niks

memverifikasi bahwa Jackson benar-benar adalah penyedia yang dikonfigurasi dan bukan sesuatu yang lain
henrik_lundgren

2
apakah ada cara untuk memanfaatkan Jackson (atau GSON) untuk mengubah nama properti dalam string JSON yang sudah ada (tidak selama serialisasi)?
Don Cheadle

Saya telah menggunakan objek @JsonProperty ("object") val jsonObject: String, ... tetapi gagal
Raju yourPepe

45

Sadarilah bahwa ada org.codehaus.jackson.annotate.JsonPropertydi Jackson 1.x dan com.fasterxml.jackson.annotation.JsonPropertyJackson 2.x. Periksa ObjectMapper mana yang Anda gunakan (dari versi mana), dan pastikan Anda menggunakan anotasi yang tepat.


Ada juga org.json4s.jacksonnamespace. :) dan kemungkinan implementasi jacksonYMMV lainnya.
Jesse Chisholm

14

Ada satu opsi lagi untuk mengganti nama bidang:

Jackson MixIns .

Berguna jika Anda berurusan dengan kelas pihak ketiga, yang tidak dapat Anda anotasi , atau Anda hanya tidak ingin mencemari kelas dengan anotasi khusus Jackson.

Dokumentasi Jackson untuk Mixins sudah usang, jadi contoh ini dapat memberikan lebih banyak kejelasan. Intinya: Anda membuat kelas mixin yang melakukan serialisasi seperti yang Anda inginkan. Kemudian daftarkan ke ObjectMapper:

objectMapper.addMixIn(ThirdParty.class, MyMixIn.class);

Saya ingin tahu apakah ini akan memengaruhi kinerja saat membuat serialisasi / deserialisasi bidang?
chanllen

2

Jackson

Jika Anda menggunakan Jackson, maka Anda dapat menggunakan @JsonProperty anotasi untuk menyesuaikan nama properti JSON yang diberikan.

Oleh karena itu, Anda hanya perlu memberi anotasi pada bidang entitas dengan @JsonPropertyanotasi dan memberikan nama properti JSON khusus, seperti ini:

@Entity
public class City {

   @Id
   @JsonProperty("value")
   private Long id;

   @JsonProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}

JavaEE atau JakartaEE JSON-B

JSON-B adalah lapisan pengikat standar untuk mengkonversi objek Java ke dan dari JSON. Jika Anda menggunakan JSON-B, maka Anda dapat mengganti nama properti JSON melalui @JsonbPropertyanotasi:

@Entity
public class City {

   @Id
   @JsonbProperty("value")
   private Long id;

   @JsonbProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.