مقدمة
في مشاريع التطوير الفعلية ، يستخدم الخادم في كثير من الأحيان السلسلة الفارغة "" كنتيجة للعودة لتمثيل القيمة الفارغة ، ولكن هذا سيواجه مشاكل في GSON. إذا لم يكن نوع هذه البيانات سلسلة ، فسيقوم GSON بالإبلاغ عن خطأ عند تحليلها.
استثناء JSON
دعونا نلقي نظرة أولا على json عاد في الخلفية
في ظل الظروف العادية JSON:
{"Code": 0 ، "MSG": "OK" ، "Data": {"id": 5638 ، "NewsId": 5638}}فئة الكيان المقابلة لجزء البيانات:
الطبقة العامة jsonbean {private int id ؛ Private Int Newsid ؛ public 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 ؛ }}استثناء JSON (لم يتم العثور على البيانات المقابلة في حقل NewsId قاعدة بيانات الخلفية):
{"Code": 0 ، "MSG": "OK" ، "Data": {"id": 5638 ، "NewsId": ""}}وبهذه الطريقة ، ستقوم GSON بإلقاء استثناء بأخطاء التحليل عند التحليل ، ويتعطل التطبيق لأنه لا يمكن تحويل "" إلى int
معالجة استثناءات JSON
نتوقع أنه عندما يتم إرجاع استثناء JSON في الخلفية ، يتم تحويل القيمة الفارغة المقابلة إلى القيمة الافتراضية ، مثل: newsId=0;
نحن هنا نستبعد التصحيحات لك عندما تخرج مطورو الخلفية ، لا يزال يتعين علينا الاعتماد على أنفسنا-
نكتب محول نوع لقيم int ، والتي تحتاج إلى تنفيذ واجهة JsonSerializer<T> من GSON و JsonDeserializer<T> ، أي واجهات التسلسل والفخاري
الطبقة العامة integerDefault0Adapter تنفذ jsonserializer <integer> ، JSondeserializer <integer> {Override Public Integer Deserialize (jsonelement json ، type type ، jsondeserializationcontext context) jsonparsexception json.getasstring (). يساوي ("null")) {// تعريف int int ، إذا كانت الخلفية تُرجع "" أو null ، return 0 ؛ }} catch (استثناء تجاهل) {} جرب {return json.getasint () ؛ } catch (numberFormatexception e) {رمي new jsonsyntaxException (e) ؛ }} Override public jsonelement serialize (Integer SRC ، typeofsrc ، JsonSerializationContext context) {return new JSonprimitive (SRC) ؛ }} وبالمثل ، أنواع طويلة ومزدوجة
مزدوج =>
الطبقة العامة doubledefault0adapter تنفذ jsonserializer <bould> ، jsondeserializer <bourse> {Override public deserialize deserialize (jsonelement json ، type typeoft ، jsondeserializationcontext) يلقي jsonparseexception {if (json.getasstring (). json.getasstring (). يساوي ("null")) {// تعريف كنوع مزدوج ، إذا كانت الخلفية تعود "" أو null ، إرجاع 0.00 إرجاع 0.00 ؛ }} catch (استثناء تجاهل) {} جرب {return json.getasdouble () ؛ } catch (numberFormatexception e) {رمي new jsonsyntaxException (e) ؛ }} Override public jsonelement serialize (double SRC ، typeofsrc ، jsonserializationcontext context) {return new jsonprimitive (src) ؛ }}طويل =>
الطبقة العامة LongDefault0Adapter تنفذ jsonserializer <Brong> ، JSondeserializer <Ngon> {Override Public Deserialize Long (jsonelement json ، type typeoft ، jsondeserializationcontext) json.getasstring (). يساوي ("null")) {// تعريف نوع طويل ، إذا كانت الخلفية تُرجع "" أو null ، إرجاع 0L ؛ }} catch (استثناء تجاهل) {} جرب {return json.getaslong () ؛ } catch (numberFormatexception e) {رمي new jsonsyntaxException (e) ؛ }} Override public jsonelement serialize (src long ، typeofsrc ، jsonserializationcontext context) {return new Jsonprimitive (src) ؛ }}لذا فإن الاستخدام مثل هذا:
إرجاع retrofit.builder () rxjava.baseurl (baseurl) .build () ؛/** * أضف معالجة "" و "null" في الخلفية * 1.int => 0 * 2.double => 0.00 * 3.long => 0l * * return */public static buildgson () {if (gson == null) .rgistertypeadapter (integer.class ، integerdefault0adapter ()) .registerTyPeadApter (int.class ، integerdefault0adapter () .rgistertypeadapter (long.class ، new LongDefault0Adapter ()) .Create () ؛ } إرجاع GSON ؛}لن تصطدم أبدًا لأن حقل JSON الخلفي فارغ مرة أخرى
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون محتوى هذه المقالة مفيدًا لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل.