Pertanyaan Konversi nama properti gaya JSON ke nama Java CamelCase dengan GSON


saya menggunakan GSON untuk mengkonversi data JSON yang saya dapatkan ke objek Java. Ini bekerja dengan sangat baik di semua tes saya. Masalahnya adalah bahwa objek nyata kita memiliki beberapa properti bernama seperti is_online. GSON hanya memetakan mereka jika namanya benar-benar sama, akan lebih baik jika GSON mengonversi nama menjadi kasus unta Java isOnline.

Tampaknya ini mungkin saat membuat data JSON, kasus unta dikonversi menjadi menggarisbawahi kata-kata terpisah di JSON. Tapi saya tidak dapat menemukan cara untuk menentukan ini dengan cara lain.


74
2018-03-03 11:28


asal


Jawaban:


Saya telah menemukan pengaturan berikut bekerja sempurna ketika membaca json dengan atribut digarisbawahi dan menggunakan camelcasing dalam model saya.

Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .create()

223
2017-08-04 16:26



Anda dapat menggunakan SerializedName anotasi:

@SerializedName("field_name_in_json")
private final String fieldNameInJava;

Catatan: Bila Anda telah mengatur FieldNamingPolicy sudah, SerializedName akan menimpa pengaturannya untuk bidang tertentu (cukup berguna untuk kasus khusus).


64
2017-10-21 10:23



Ingatlah bahwa contoh Anda adalah kasus tepi. Jika Anda memiliki properti 'foo' pengambilnya harus diberi nama 'getFoo', dan jika Anda memiliki properti bernama 'foo_bar' pengambilnya harus diberi nama 'getFooBar', namun, dalam contoh Anda memetakan boolean dan boolean konvensi penamaan kasus khusus di java. Sebuah properti boolean primitif bernama online harus memiliki pengambil bernama 'isOnline', BUKAN 'getOnline' atau bahkan lebih buruk, 'getIsOnline'. Objek wrapper boolean (yaitu Boolean) tidak boleh mengikuti kasus khusus ini dan properti bernama 'online' harus memiliki pengambil yang bernama 'getOnline'.

Oleh karena itu, memiliki properti boolean dengan 'adalah' dalam nama adalah kasus tepi, di mana Anda ingin menghapus awalan khusus ini selama konversi Anda. Dalam arah sebaliknya, kode Anda mungkin ingin memeriksa objek json baik untuk nama properti mentah maupun versi 'is_XXX'.


2
2017-09-09 13:37



Saya pikir apa yang Anda inginkan adalah sini. Dengan menggunakan anotasi, Anda dapat memberi tahu GSON bahwa mySuperCoolField benar-benar disebut this_field_is_fun di JSON dan ia akan membongkarnya dengan benar. Setidaknya saya pikir itu bekerja untuk deserialization juga.

Jika itu tidak berhasil, Anda dapat menggunakan JsonSerializer / JsonDeserializers kustom, yang berfungsi dengan baik, tetapi Anda harus memperbaruinya untuk perubahan di kelas Anda (seperti ketika Anda menambahkan bidang). Anda kehilangan sihir-otomatis.

Hal termudah untuk dilakukan (yang akan jelek, tapi sangat bersih dan sederhana jika saran pertama tidak berfungsi) adalah dengan hanya menamai bidang dengan cara membuat GSON senang, dan menambahkan metode ekstra aksesor dengan nama yang Anda suka , misalnya

public boolean isXXX() {return this.is_XXX;}

2
2017-09-09 13:46