Saya meminta data dari server yang mengembalikan data dalam format JSON. Casting HashMap ke JSON saat membuat permintaan itu tidak sulit sama sekali tetapi sebaliknya tampaknya sedikit rumit. Respons JSON terlihat seperti ini:
{
"header" : {
"alerts" : [
{
"AlertID" : "2",
"TSExpires" : null,
"Target" : "1",
"Text" : "woot",
"Type" : "1"
},
{
"AlertID" : "3",
"TSExpires" : null,
"Target" : "1",
"Text" : "woot",
"Type" : "1"
}
],
"session" : "0bc8d0835f93ac3ebbf11560b2c5be9a"
},
"result" : "4be26bc400d3c"
}
Cara apa yang paling mudah untuk mengakses data ini? Saya menggunakan modul GSON.
Map<String,Object> result = new Gson().fromJson(json, Map.class);
bekerja dengan gson 2.6.2.Jawaban:
Ini dia:
sumber
TypeToken
- itu tidak pengecoran implisit di dalam.{"k1":"apple","k2":"orange"}
Kode ini berfungsi:
sumber
Map<String, Object>
karena jika json tidak hanya string Anda mendapatkan kesalahanTypeToken
.Saya tahu ini adalah pertanyaan yang cukup lama, tapi saya sedang mencari solusi untuk deserialize umum bersarang JSON ke
Map<String, Object>
, dan tidak menemukan apa pun.Cara deserializer yaml saya berfungsi, default objek JSON
Map<String, Object>
ketika Anda tidak menentukan tipe, tetapi gson tampaknya tidak melakukan ini. Untungnya Anda dapat mencapainya dengan deserializer khusus.Saya menggunakan deserializer berikut untuk secara alami deserialize apa pun, default
JsonObject
s keMap<String, Object>
danJsonArray
s keObject[]
s, di mana semua anak deserialized sama.Kekacauan dalam
handlePrimitive
metode ini adalah untuk memastikan Anda hanya mendapatkan Double atau Integer atau Long, dan mungkin bisa lebih baik, atau setidaknya disederhanakan jika Anda baik-baik saja dengan mendapatkan BigDecimal, yang saya percaya adalah default.Anda dapat mendaftarkan adaptor ini seperti:
Dan kemudian menyebutnya seperti:
Saya tidak yakin mengapa ini bukan perilaku default di gson, karena itu di sebagian besar perpustakaan serialisasi semi-terstruktur ...
sumber
Dengan google's Gson 2.7 (mungkin versi yang lebih lama juga, tapi saya diuji dengan versi 2.7 saat ini) sesederhana:
Yang mengembalikan
Map
tipecom.google.gson.internal.LinkedTreeMap
dan bekerja secara rekursif pada objek bersarang, array, dll.Saya menjalankan contoh OP seperti itu (cukup diganti dengan tanda kutip tunggal dan spasi kosong dihapus):
Dan mendapat hasil sebagai berikut:
sumber
Pembaruan untuk lib Gson baru:
Anda sekarang dapat mem-parsing Json bersarang ke Peta secara langsung, tetapi Anda harus berhati-hati jika Anda mencoba menguraikan Json untuk
Map<String, Object>
mengetik: itu akan memunculkan pengecualian. Untuk memperbaikinya, cukup deklarasikan hasilnya sebagaiLinkedTreeMap
tipe. Contoh di bawah ini:sumber
Map<String,Object> result = gson.fromJson(json , Map.class);
. Menggunakan gson 2.6.2.Saya memiliki pertanyaan yang sama persis dan berakhir di sini. Saya memiliki pendekatan berbeda yang tampaknya jauh lebih sederhana (mungkin versi gson yang lebih baru?).
dengan json berikut
Pengikut
output
Anda dapat secara dinamis memeriksa menggunakan instanceof saat menavigasi jsonObject Anda. Sesuatu seperti
Ini bekerja untuk saya, jadi itu harus bekerja untuk Anda ;-)
sumber
Di bawah ini didukung sejak gson 2.8.0
sumber
Coba ini, ini akan berhasil. Saya menggunakannya untuk Hashtable .
Ganti KioskStatusResource ke kelas Anda dan Integer ke kelas utama Anda.
sumber
Inilah yang saya gunakan:
sumber
Berikut ini adalah satu-liner yang akan melakukannya:
sumber
new TypeToken<HashMap<String, Object>>(){}
akan membuat sub-kelas inline baru, dan semua linter akan memunculkan peringatan setidaknya saya kiraSaya telah mengatasi masalah serupa dengan Custom JsonDeSerializer. Saya mencoba membuatnya agak generik tetapi masih belum cukup. Ini adalah solusi yang sesuai dengan kebutuhan saya.
Pertama-tama Anda perlu mengimplementasikan JsonDeserializer baru untuk objek Map.
Dan metode deserialize akan terlihat mirip dengan ini:
Yang cocok dengan solusi ini, adalah bahwa kunci Peta saya selalu bertipe "String". Namun dengan menyanyikan beberapa hal seseorang dapat membuatnya generik. Selain itu, saya perlu mengatakan, bahwa kelas nilai harus diteruskan dalam konstruktor. Jadi metode
getMyType()
dalam kode saya mengembalikan tipe nilai-nilai Peta, yang diteruskan dalam konstruktor.Anda dapat mereferensikan pos ini Bagaimana cara menulis deserializer JSON khusus untuk Gson? untuk mempelajari lebih lanjut tentang deserializers khusus.
sumber
Anda dapat menggunakan kelas ini sebagai gantinya :) (menangani daftar genap, daftar bersarang, dan json)
Untuk mengonversi string JSON Anda ke hashmap gunakan ini:
sumber
Ini lebih merupakan tambahan untuk jawaban Kevin Dolan daripada jawaban yang lengkap, tapi saya kesulitan mengekstraksi tipe dari Number. Ini solusi saya:
sumber
sumber
JSONObject biasanya menggunakan
HashMap
internal untuk menyimpan data. Jadi, Anda bisa menggunakannya sebagai Peta dalam kode Anda.Contoh,
sumber
Saya menggunakan kode ini:
sumber