Kata pengantar
Dalam proyek pengembangan yang sebenarnya, server sering menggunakan string kosong "" sebagai hasil pengembalian untuk mewakili nilai kosong, tetapi ini akan menghadapi masalah di GSON. Jika jenis data ini bukan string, GSON akan melaporkan kesalahan saat mem -parsing.
Pengecualian JSON
Pertama -tama mari kita lihat JSON yang dikembalikan di latar belakang
Dalam keadaan normal json:
{"kode": 0, "msg": "ok", "data": {"id": 5638, "newsid": 5638}}Kelas entitas yang sesuai dengan bagian data:
kelas publik jsonbean {private int id; Private int Newsid; publik int getId () {return id; } public void setid (int id) {this.id = id; } public int getNewSid () {return newsId; } public void setNewSid (int NewsID) {this.newsid = newsId; }}Pengecualian JSON (data yang sesuai tidak ditemukan di bidang newsid database latar belakang):
{"kode": 0, "msg": "ok", "data": {"id": 5638, "newsid": ""}}Dengan cara ini, GSON akan melempar pengecualian dengan kesalahan parsing saat parsing, dan aplikasi macet karena tidak dapat mengonversi "" menjadi int
Penanganan pengecualian JSON
Kami berharap bahwa ketika pengecualian JSON dikembalikan di latar belakang dapat berhasil diuraikan, nilai nol yang sesuai dikonversi ke nilai default, seperti: newsId=0;
Di sini kami mengecualikan koreksi untuk Anda saat pengembang latar belakang, kami masih harus mengandalkan diri kami sendiri-
Kami menulis konverter tipe untuk nilai int, yang perlu mengimplementasikan antarmuka JsonSerializer<T> dan JsonDeserializer<T> , yaitu, serialisasi dan antarmuka deserialisasi
Public Class Integerdefault0Adapter mengimplementasikan JSonserializer <Integer>, jsondeserializer <Integer> {@Override Public Integer Deserialize (JSONElement Json, Type Typeoft, JSondeSerializationContext Context) (JSonEnElException {try {ife {JSED {JSET (JSON (JSON (JSET (JSET (JSONSERIALIONAL). json.getAsstring (). Equals ("null")) {// Tentukan sebagai tipe int, jika latar belakang mengembalikan "" atau null, return 0; }} catch (ablection abaikan) {} coba {return json.getasInt (); } catch (numberFormateException e) {lempar jSonsyntaxException baru (e); }} @Override Public JSonElement Serialize (Integer SRC, Type TypeOfSRC, JSonserializationContext Context) {return new jsonprimitive (src); }} Demikian pula, tipe panjang dan ganda
ganda =>
Kelas Publik Doubledefault0Adapter mengimplementasikan jsonserializer <mouble>, jsondeserializer <mouble> {@Override Public Double Deserialize (JsonElement Json, Type Typeoft, JSondeSerializationContext Context) melempar JsonParseException {try {if (json.getasstring (). ") json.getAsstring (). Equals ("null")) {// Tentukan sebagai tipe ganda, jika latar belakang kembali "" atau null, mengembalikan 0,00 pengembalian 0,00; }} catch (pengecualian abaikan) {} coba {return json.getAsdouble (); } catch (numberFormateException e) {lempar jSonsyntaxException baru (e); }} @Override Public JSonElement Serialize (SRC ganda, tipe typeOfSRC, JSonserializationContext konteks) {return new jsonprimitive (src); }}long =>
Kelas Publik LongDefault0Adapter mengimplementasikan jsonserializer <mendong>, jsondeserializer <mendong> {@override public long deserialize (jsonelement json, type typeoft, jsondeserialization context context) melempar jsonparseException {try {if (json.getasstring (). ") json.getAsstring (). Equals ("null")) {// Tentukan sebagai tipe panjang, jika latar belakang kembali "" atau null, return 0L; }} catch (pengecualian abaikan) {} coba {return json.getAslong (); } catch (numberFormateException e) {lempar jSonsyntaxException baru (e); }} @Override Public JSonElement Serialize (Long SRC, Type TypeOfSRC, JSonserializationContext Context) {return new jsonprimitive (src); }}Jadi penggunaan seperti ini:
kembalikan retrofit.builder baru () .client (okhttpclient) // Setel jaringan akses framework.addconverterfactory (gsonconverterfactory.create (buildgson ()) // tambahkan json conversion framework.addcallapterfactory (rxJavacallAdapterfactory.addcallAdapterfactory (rxJavacallAdapterfacory.addcallapterfactory (rxjavacallapterfacory.addcallapter Rxjava.baseUrl (baseUrl) .build ();/** * Tambahkan pemrosesan "" dan "null" di latar belakang * 1.int => 0 * 2.double => 0.00 * 3.long => 0l * * @return */public static gson Guildgson () {if (gson == null) {null) {gson public gson gsonson () {if (gson == null) {null) {gson = gson gson gson () {if (gson == null) {null) {gson = gson gson gson () {ifson == null) {null) {gson = gson gson gsonson () {if (gson == null) {null) {gson = gson Gson gsonson () {if (gson == null) {null) .RegisterTypeAdapter (integer.class, integerdefault0Adapter baru ()) .registertypeadapter (int.class, integerDefault0Adapter baru ()) .registertypeadapter (double.class, new doubledefault0Adapter ()) .registertypeadapter (double.class, doubledefault0Adapter (). .registertypeadapter (long.class, new longdefault0Adapter ()) .create (); } return gson;}Tidak akan pernah macet karena latar belakang latar belakang lapangan kosong lagi
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini akan membantu untuk belajar atau bekerja semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi.