Buat kesenangan sebaris ini:
inline fun <reified T> Gson.fromJson(json: String) = fromJson<T>(json, object: TypeToken<T>() {}.type)
dan kemudian Anda dapat menyebutnya dengan cara ini:
val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)
Alternatif Sebelumnya:
ALTERNATIF 1:
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
Anda harus memasukkan object :
dan jenis tertentu masukfromJson<List<Turns>>
ALTERNATIF 2:
Seperti yang disebut @cypressious, hal itu dapat dicapai juga dengan cara ini:
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
digunakan sebagai:
val turnsType = genericType<List<Turns>>()
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
Ini menyelesaikan masalah:
Baris pertama membuat ekspresi objek yang diturunkan dari
TypeToken
dan kemudian mendapatkan JavaType
darinya. KemudianGson().fromJson
metode tersebut membutuhkan tipe yang ditentukan untuk hasil fungsi (yang harus cocok dengan yangTypeToken
dibuat). Dua versi dari karya ini, seperti di atas atau:Untuk mempermudah pembuatannya,
TypeToken
Anda bisa membuat fungsi helper, yang harus inline agar bisa menggunakan parameter tipe reified :Yang kemudian dapat digunakan dengan salah satu cara berikut:
Dan seluruh proses dapat digabungkan menjadi fungsi ekstensi untuk
Gson
contoh:Sehingga Anda dapat menelepon Gson dan tidak khawatir tentang hal tersebut
TypeToken
:Di sini Kotlin menggunakan inferensi tipe dari satu sisi tugas atau sisi lainnya, dan reifikasi generik untuk fungsi sebaris agar melewati tipe lengkap (tanpa penghapusan), dan menggunakannya untuk membuat
TypeToken
dan juga melakukan panggilan ke Gsonsumber
Gson().fromJson<kotlin.List<Turns>>(pref.turns)
Gson()
atauGson
seolah-olah itu statis? Anda membutuhkan yang pertama, sebuah contoh.Opsi lain (tidak yakin tampilannya lebih elegan dari yang lain) mungkin panggilan seperti ini:
Jadi, Anda menggunakan liner java Array class one daripada "Kotlin murni".
sumber
Ini cara saya untuk mem-parsing larik data di kotlin.
sumber
Saya menggunakan sesuatu seperti ini untuk mengubah
T
kestring
&String
kembaliT
menggunakanGson
. Bukan apa yang Anda cari, tetapi untuk berjaga-jaga.sumber
Ini bekerja dengan baik, dan lebih sederhana
sumber
Kotlin
generic reified function
dari Gson deserialize untukArrayList<T>
menggunakan kode inisumber