Saya memiliki kelas Java MyPojo
yang ingin saya deserialisasi dari JSON. Saya telah mengonfigurasi kelas MixIn khusus,, MyPojoDeMixIn
untuk membantu saya dengan deserialisasi. MyPojo
hanya memiliki int
dan String
variabel instan digabungkan dengan pengambil dan penyetel yang tepat. MyPojoDeMixIn
terlihat seperti ini:
public abstract class MyPojoDeMixIn {
MyPojoDeMixIn(
@JsonProperty("JsonName1") int prop1,
@JsonProperty("JsonName2") int prop2,
@JsonProperty("JsonName3") String prop3) {}
}
Di klien uji saya, saya melakukan hal berikut, tetapi tentu saja itu tidak berfungsi pada waktu kompilasi karena ada yang JsonMappingException
terkait dengan ketidakcocokan tipe.
ObjectMapper m = new ObjectMapper();
m.getDeserializationConfig().addMixInAnnotations(MyPojo.class,MyPojoDeMixIn.class);
try { ArrayList<MyPojo> arrayOfPojo = m.readValue(response, MyPojo.class); }
catch (Exception e) { System.out.println(e) }
Saya sadar bahwa saya dapat mengatasi masalah ini dengan membuat objek "Respons" yang hanya memiliki satu ArrayList<MyPojo>
di dalamnya, tetapi kemudian saya harus membuat objek yang agak tidak berguna ini untuk setiap jenis yang ingin saya kembalikan.
Saya juga melihat JacksonInFiveMinutes secara online tetapi kesulitan memahami hal-hal tentang Map<A,B>
dan bagaimana kaitannya dengan masalah saya. Jika Anda tidak tahu, saya sama sekali baru mengenal Java dan berasal dari latar belakang Obj-C. Mereka secara khusus menyebutkan:
Selain mengikat ke POJO dan tipe "sederhana", ada satu varian tambahan: yang mengikat ke kontainer generik (diketik). Kasus ini memerlukan penanganan khusus karena apa yang disebut Type Erasure (digunakan oleh Java untuk mengimplementasikan generik dengan cara yang agak kompatibel ke belakang), yang mencegah Anda menggunakan sesuatu seperti Collection.class (yang tidak dapat dikompilasi).
Jadi, jika Anda ingin mengikat data ke dalam Peta, Anda perlu menggunakan:
Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });
Bagaimana saya bisa melakukan deserialisasi langsung ke ArrayList
?
Jawaban:
Anda dapat melakukan deserialisasi langsung ke daftar dengan menggunakan
TypeReference
pembungkus. Metode contoh:Dan digunakan sebagai berikut:
TypeReference Javadoc
sumber
TypeReference
- Saya hanya tidak mengerti cara melakukannya ... Silakan lihat hasil edit saya di atas untuk instruksi mereka tentang cara menggunakan obat generik.arrayList.toString()
tentang aNullPointerException
. Saya menduga bahwa ini bisa jadi karena myPOJO
tidak sesuai dengan konvensi penamaan yang tepat untuk propertinya, yaitu, seluruh masalah adalah bahwa layanan web kembaliProp1Member
dan objek saya memilikinyaProp1
. Ini adalah satu-satunya alasan sebenarnya saya menggunakan mixin untuk memulai, jadi saya tidak harus meletakkan deklarasi untuk@JsonProperty
objek murni saya.Cara lain adalah dengan menggunakan array sebagai tipe, misalnya:
Dengan cara ini Anda menghindari semua kerumitan dengan objek Type, dan jika Anda benar-benar membutuhkan daftar, Anda selalu dapat mengonversi larik menjadi daftar dengan:
IMHO ini jauh lebih mudah dibaca.
Dan untuk membuatnya menjadi daftar yang sebenarnya (yang dapat dimodifikasi, lihat batasannya
Arrays.asList()
) maka cukup lakukan hal berikut:sumber
TypeFactory
seperti yang dijelaskan dalam jawaban berikutnya: stackoverflow.com/a/42458104/91497 adalah cara Jackson untuk menentukan jenisnya.Varian ini terlihat lebih simpel dan elegan.
sumber
CollectionType
referensi eksplisitnya .Saya juga mengalami masalah yang sama. Saya memiliki json yang akan diubah ke ArrayList.
Akun terlihat seperti ini.
Semua kelas di atas telah dianotasi dengan benar. Saya telah mencoba TypeReference> () {} tetapi tidak berhasil.
Ini memberi saya Arraylist tetapi ArrayList memiliki linkedHashMap yang berisi beberapa hashmaps tertaut yang berisi nilai akhir.
Kode saya adalah sebagai berikut:
Saya akhirnya memecahkan masalah. Saya dapat mengonversi Daftar di Json String langsung ke ArrayList sebagai berikut:
sumber
Ini berhasil untuk saya.
sumber