Saya memiliki string json, yang harus saya deSerialize ke kelas berikut
class Data <T> {
int found;
Class<T> hits
}
Bagaimana saya melakukannya? Ini cara yang biasa
mapper.readValue(jsonString, Data.class);
Tetapi bagaimana saya menyebutkan apa singkatan T?
Jawaban:
Anda perlu membuat
TypeReference
objek untuk setiap jenis generik yang Anda gunakan dan menggunakannya untuk deserialization. Sebagai contoh -sumber
Data<T>
, itu BUKAN tipe. Anda harus menentukan kelas aktual; selain itu sama denganData<Object>
.TypeReference
? itucom.fasterxml.jackson.core.type
?Anda tidak dapat melakukan itu: Anda harus menentukan jenis yang diselesaikan sepenuhnya, seperti
Data<MyType>
.T
hanyalah sebuah variabel, dan seperti tidak ada artinya.Tetapi jika yang Anda maksud itu
T
akan diketahui, hanya saja tidak statis, Anda perlu membuat yang setara denganTypeReference
dinamis. Pertanyaan lain yang dirujuk mungkin sudah menyebutkan ini, tetapi seharusnya terlihat seperti:sumber
TypeReference
:return mapper.readValue(json, clazz);
Apa sebenarnya masalahnya di sini?TypeFactory
.. Saya akan mengedit jawaban saya.Hal pertama yang Anda lakukan adalah membuat cerita bersambung, maka Anda dapat melakukan deserialize.
jadi ketika Anda membuat cerita bersambung, Anda harus menggunakan
@JsonTypeInfo
jackson untuk menulis informasi kelas ke dalam data json Anda. Yang bisa Anda lakukan adalah seperti ini:Kemudian ketika Anda deserialize, Anda akan menemukan jackson telah deserialize data Anda ke dalam sebuah kelas yang variabel Anda hit sebenarnya saat runtime.
sumber
Untuk Data kelas <>
sumber
Cukup tulis metode statis di kelas Util. Saya membaca Json dari file. Anda dapat memberikan String juga ke readValue
Pemakaian:
sumber
Anda bisa membungkusnya di kelas lain yang tahu tipe tipe generik Anda.
Misalnya,
Here Something adalah tipe konkret. Anda memerlukan pembungkus per jenis yang telah diverifikasi. Kalau tidak, Jackson tidak tahu benda apa yang harus dibuat.
sumber
String JSON yang perlu deserialized harus berisi informasi tipe tentang parameter
T
.Anda harus meletakkan anotasi Jackson pada setiap kelas yang dapat diteruskan sebagai parameter
T
ke kelasData
sehingga informasi tipe tentang tipe parameterT
dapat dibaca dari / ditulis ke string JSON oleh Jackson.Mari kita asumsikan bahwa
T
dapat berupa kelas apa saja yang memperluas kelas abstrakResult
.Setelah masing-masing kelas (atau supertipe umum mereka) yang dapat dilewati sebagai parameter
T
dianotasi, Jackson akan memasukkan informasi tentang parameterT
di JSON. JSON tersebut kemudian dapat dideeralisasi tanpa mengetahui parameterT
pada waktu kompilasi. Tautan dokumentasi Jacksonini berbicara tentang Deserialisasi Polimorfik tetapi juga bermanfaat untuk merujuk pada pertanyaan ini.
sumber
Dari Jackson 2.5, cara elegan untuk menyelesaikannya adalah menggunakan metode TypeFactory.constructParametricType (Class parametrized, Class ... parameterClasses) yang memungkinkan untuk mendefinisikan straigthly Jackson
JavaType
dengan menentukan kelas parameter dan tipe parameternya.Seandainya Anda ingin deserialize
Data<String>
, Anda dapat melakukan:Perhatikan bahwa jika kelas mendeklarasikan beberapa tipe parameter, itu tidak akan menjadi lebih sulit:
Kita bisa lakukan :
sumber
sumber
jika Anda menggunakan scala dan mengetahui tipe generik pada waktu kompilasi, tetapi tidak ingin meneruskan TypeReference secara manual di mana saja di semua server api Anda, Anda dapat menggunakan kode berikut (dengan jackson 2.9.5):
yang bisa digunakan seperti ini:
sumber
Untuk menghapus deserialisasi string JSON generik ke objek Java dengan Jackson, Anda perlu:
Untuk mendefinisikan kelas JSON.
Lakukan pemetaan atribut.
Kode akhir, teruji, dan siap digunakan:
Penting:
@JsonAnySetter
anotasi adalah wajib, itu memastikan JSON-parsing dan populasi umum.Untuk kasus yang lebih rumit dengan array bersarang, lihat referensi Baeldung: https://www.baeldung.com/jackson-mapping-dynamic-object
sumber
Contoh keputusan yang tidak terlalu bagus, tetapi sederhana (tidak hanya untuk Jackson, juga untuk Spring RestTemplate, dll.):
sumber