คำนำ
ในโครงการพัฒนาจริงเซิร์ฟเวอร์มักใช้สตริงว่าง "" เป็นผลการส่งคืนเพื่อแสดงถึงค่าที่ว่างเปล่า แต่สิ่งนี้จะพบปัญหาใน GSON หากประเภทของข้อมูลนี้ไม่ใช่สตริง GSON จะรายงานข้อผิดพลาดเมื่อแยกวิเคราะห์
ข้อยกเว้น JSON
ก่อนอื่นให้ดูที่ JSON ที่กลับมาในพื้นหลัง
ภายใต้สถานการณ์ปกติ JSON:
{"รหัส": 0, "msg": "ตกลง", "data": {"id": 5638, "newsid": 5638}}คลาสเอนทิตีที่สอดคล้องกับส่วนข้อมูล:
คลาสสาธารณะ JsonBean {ID INT ส่วนตัว; ข่าวส่วนตัว สาธารณะ int getId () {return id; } โมฆะสาธารณะ setId (int id) {this.id = id; } สาธารณะ int getNewsid () {return newsid; } โมฆะสาธารณะ setNewsid (int newsid) {this.newsid = newsid; -ข้อยกเว้น JSON (ไม่พบข้อมูลที่เกี่ยวข้องในฟิลด์ฐานข้อมูลพื้นหลัง NEWSID):
{"รหัส": 0, "msg": "ตกลง", "data": {"id": 5638, "newsid": ""}}ด้วยวิธีนี้ GSON จะทำการยกเว้นด้วยข้อผิดพลาดในการแยกวิเคราะห์เมื่อแยกวิเคราะห์และแอปขัดข้องเพราะมันไม่สามารถแปลง "" เป็น INT
การจัดการข้อยกเว้น JSON
เราคาดหวังว่าเมื่อข้อยกเว้น JSON ที่ส่งคืนในพื้นหลังสามารถแยกวิเคราะห์ได้สำเร็จค่า NULL ที่สอดคล้องกันจะถูกแปลงเป็นค่าเริ่มต้นเช่น: newsId=0;
ที่นี่เรายกเว้นการแก้ไขสำหรับคุณเมื่อนักพัฒนาพื้นหลังส่งออกเรายังคงต้องพึ่งพาตัวเอง-
เราเขียนตัวแปลงประเภทสำหรับค่า int ซึ่งจำเป็นต้องใช้อินเทอร์เฟ JsonSerializer<T> ของ GSON และ JsonDeserializer<T> นั่นคือการทำให้เป็นอนุกรมและการเชื่อมต่อแบบ deserialization
ชั้นเรียนสาธารณะจำนวนเต็ม Fault0Adapter ใช้ JSonserializer <Integer>, jondeserializer <Teeger> {@Override Integer สาธารณะ deserialize (jsonElement JSON, typeoft, jSondeserialization context json.getAstString (). เท่ากับ ("null")) {// กำหนดเป็นประเภท int ถ้าพื้นหลังส่งคืน "" หรือ null, return 0; }} catch (ข้อยกเว้นละเว้น) {} ลอง {return json.getAsint (); } catch (numberFormatexception e) {โยน jsonsyntaxexception ใหม่ (e); }} @Override สาธารณะ jsonElement serialize (จำนวนเต็ม src, ประเภท typeofsrc, jSonserializationContext บริบท) {ส่งคืน jsonprimitive ใหม่ (SRC); - ในทำนองเดียวกันประเภทยาวและคู่
double =>
ชั้นเรียนสาธารณะ Doubledefault0Apter ใช้ JSonserializer <bouble>, jSondeserializer <bouble> {@Override สาธารณะ double deserialize (jsonElement JSON, typeoft, jsonDeserializationContext) โยน jsonParSeException {ลอง {ถ้า json.getString ( json.getAstString (). เท่ากับ ("null")) {// กำหนดเป็นสองประเภทถ้าพื้นหลังส่งคืน "" หรือ null, ส่งคืน 0.00 กลับ 0.00; }} catch (ข้อยกเว้นละเว้น) {} ลอง {return json.getasdouble (); } catch (numberFormatexception e) {โยน jsonsyntaxexception ใหม่ (e); }} @Override สาธารณะ jsonElement serialize (double src, typeofsrc, jSonserializationContext บริบท) {ส่งคืน jsonprimitive ใหม่ (SRC); -ยาว =>
Public Class LongDefault0Adapter ใช้ JSonserializer <Long>, JSondeserializer <lont> {@Override สาธารณะยาว deserialize (jsonElement JSON, typeoft, jsonDeserializationContext) โยน jsonparseException {ลอง {ถ้า (json.getasstring () json.getAstString (). เท่ากับ ("null")) {// กำหนดประเภทยาวถ้าพื้นหลังส่งคืน "" หรือ null, ส่งคืน 0l; }} catch (ข้อยกเว้นละเว้น) {} ลอง {return json.getaslong (); } catch (numberFormatexception e) {โยน jsonsyntaxexception ใหม่ (e); }} @Override สาธารณะ JsonElement Serialize (Long Src, ประเภท TypeOfSrc, jSonserializationContext บริบท) {ส่งคืน JSONPrimitive ใหม่ (SRC); -ดังนั้นการใช้ก็เป็นเช่นนี้:
ส่งคืนใหม่ retrofit.builder () .client (okhttpClient) // ตั้งค่าการเข้าถึงเครือข่ายเฟรมเวิร์ก AddConverterToCtory (gsonConverterterTory.create (buildgson ())) // เพิ่มการแปลง JSONDFARTORTORICTORY.CALLADAPTORY rxjava.baseurl (baseUrl) .build ();/** * เพิ่มการประมวลผลของ "" และ "null" ในพื้นหลัง * 1.int => 0 * 2.double => 0.00 * 3.long => 0l * * @return */สาธารณะ . RegisterTypeadapter (Integer.class, Integerdefault0Apter ()). registerTypeadapter (int.class, IntegerDefault0Apter ()). RegisterTypeadapter . RegisterTypeadapter (Long.class, LongDefault0Adapter ใหม่ ()) .Create (); } return gson;}
จะไม่พังเนื่องจากฟิลด์พื้นหลัง JSON ว่างเปล่าอีกครั้ง
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะเป็นประโยชน์ต่อการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร