Apakah ada cara di Gson untuk memetakan beberapa bidang JSON ke variabel anggota objek Java tunggal?
Katakanlah saya memiliki kelas Java ...
public class MyClass {
String id;
String name;
}
Saya ingin menggunakan kelas tunggal ini dengan dua layanan berbeda. Namun, kedua layanan ini berbeda dalam cara mengembalikan datanya ...
{ "id": 2341, "person": "Bob" }
... dan ...
{ "id": 5382, "user": "Mary" }
... masing-masing.
Apakah ada cara untuk memetakan bidang "person"
dan "user"
dalam string JSON ke name
bidang di objek Java?
(Catatan: Saya hanya perlu mengonversi dari string JSON ke objek Java - tidak pernah sebaliknya.)
Jawaban:
Pada bulan Oktober 2015, Gson versi 2.4 ( changelog ) menambahkan kemampuan untuk menggunakan nama alternatif / banyak untuk
@SerializedName
saat deserialisasi. Tidak perlu lagi TypeAdapter khusus!Pemakaian:
https://www.javadoc.io/doc/com.google.code.gson/gson/2.6.2/com/google/gson/annotations/SerializedName.html
sumber
Tidak didukung untuk menentukan beberapa
@SerializedName
anotasi ke bidang di Gson.Alasan: Secara default Deserialization dikelola dengan LinkedHashMap dan kuncinya ditentukan oleh nama field json yang masuk (bukan nama field kelas kustom atau serializedNames) dan ada pemetaan satu lawan satu. Anda dapat melihat pelaksanaan (bagaimana deserialization bekerja) di
ReflectiveTypeAdapterFactory
kelas batin kelas iniAdapter<T>
'sread(JsonReader in)
metode.Solusi: Anda dapat menulis TypeAdapter khusus yang menangani
name
,person
danuser
tag json dan memetakannya ke bidang nama kelas khusus AndaMyClass
:Kasus cobaan:
Contoh tentang TypeAdapters.
Sunting 2016.04.06: Seperti yang ditulis oleh @Mathieu Castets pada jawabannya, sekarang ini didukung. (Itu adalah jawaban yang benar untuk pertanyaan ini.)
sumber
untuk penggemar Kotlin
sumber
Untuk KOTLIN saya gunakan di bawah ini tetapi tidak berfungsi
jadi saya mengeditnya dan ini berfungsi dengan baik !!
sumber