يمكن أن تلبي عمليات التحويل الشائعة الاستخدام للهياكل مثل القائمة والخريطة معظم الاحتياجات التي نتعامل معها ، ولكن في بعض الأحيان توجد لوائح تنسيق خاصة لـ JSON في المشروع. على سبيل المثال ، تحليل سلسلة JSON التالية:
[{"tableName":"students","tableData":[{"id":1,"name":"李坤","birthDay":"Jun 22, 2012 9:54:49 PM"},{"id":2,"name":"曹贵生","birthDay":"Jun 22, 2012 9:54:49 PM"},{"id":3,"name":"柳波","birthDay":"Jun 22, 2012 9:54:49 PM"}]},{"tableName":"teachers","tableData":[{"id":1,"name":"米老师","title":"教授"},{"id":2,"name":"丁老师","title":"讲师"}]}]
بعد التحليل ، وجدنا أن الطرق العادية ليس من السهل التعامل مع سلسلة JSON أعلاه. يرجى الاطلاع على كيفية معالجة هذه المقالة:
فئة الكيان:
استيراد java.util.date ؛ طالب الطبقة العامة {private int id ؛ اسم السلسلة الخاصة ؛ عيد ميلاد التاريخ الخاص public int getId () {return id ؛ } public void setId (int id) {this.id = id ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } التاريخ العام getBirthday () {return Birthday ؛ } public void setbirthday (Date Birthday) {this.birthday = عيد ميلاد ؛ } Override public string toString () {return "student [birthday =" + birthday + "، id =" + id + "، name =" + name + "]" ؛ }} مدرس الفئة العامة {private int id ؛ اسم السلسلة الخاصة ؛ عنوان السلسلة الخاصة ؛ public int getId () {return id ؛ } public void setId (int id) {this.id = id ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } السلسلة العامة getTitle () {return title ؛ } public void settitle (tring title) {this.title = title ؛ } Override Public String ToString () {return "Teacher [id =" + id + "، name =" + name + "،]" ؛ }}لاحظ أنه يتم تعريف فئة كيان TableData هنا:
استيراد java.util.list ؛ فئة عامة tabledata {private string tableName ؛ قائمة خاصة tabledata ؛ السلسلة العامة getTableName () {return tablename ؛ ) } القائمة العامة getTabletata () {return tabledata ؛ } public void settabledata (list tabledata) {this.tabledata = tabledata ؛ }} فئة الاختبار:
(انظر بعناية في تنفيذ تحويل JSON مرة أخرى إلى كائن ما. بعد تحويلين هنا ، فإن نتيجة الترجيح الأول هي أن الخريطة ليست هي الكائن الذي نتوقعه. بعد تحويل الخريطة إلى JSON مرة أخرى ، ثم تحويله إلى كائن.
استيراد java.util.arraylist ؛ استيراد java.util.date ؛ استيراد java.util.list ؛ استيراد com.google.gson.gson ؛ استيراد com.google.gson.reflect.tepetoken ؛ الفئة العامة gsontest5 { / ** * param args * / public static void main (string [] args) {// تحويل الكائن إلى json-> ابدأ student1 = new student () ؛ student1.setid (1) ؛ student1.setName ("Li Kun") ؛ student1.setbirthday (Date ()) ؛ الطالب 2 = طالب جديد () ؛ student2.setid (2) ؛ student2.setName ("Cao Guisheng") ؛ student2.SetBirthday (Date ()) ؛ الطالب 3 = طالب جديد () ؛ student3.setid (3) ؛ student3.setName ("liu bo") ؛ student3.setBirthday (Date ()) ؛ قائمة <Tudent> Stulist = new ArrayList <Tudent> () ؛ Stulist.add (student1) ؛ Stulist.add (student2) ؛ Stulist.add (student3) ؛ المعلم 1 = معلم جديد () ؛ Teacher1.setId (1) ؛ Teacher1.setName ("Teacher MI") ؛ المعلم 1.Settitle ("أستاذ") ؛ المعلم 2 = معلم جديد () ؛ Teacher2.setId (2) ؛ Teacher2.SetName ("المعلم Ding") ؛ Teacher2.Settitle ("محاضر") ؛ قائمة <Sethors> teacherlist = new ArrayList <Sethor> () ؛ TeacherList.add (Teacher1) ؛ TeacherList.add (Teacher2) ؛ tabledata td1 = new tabledata () ؛ TD1.Settablename ("الطلاب") ؛ TD1.Settabledata (Stulist) ؛ tabledata td2 = new tabledata () ؛ TD2.Settablename ("المعلمين") ؛ TD2.Settabledata (Teacherlist) ؛ قائمة <labedata> tdlist = new ArrayList <labedata> () ؛ tdlist.add (TD1) ؛ tdlist.add (TD2) ؛ gson gson = new gson () ؛ String s = gson.tojson (tdlist) ؛ system.out.println (s) ؛ // النتيجة: [{"tablename": "الطلاب" ، "tabledata": [{"{id": 1 ، "name": "li kun" ، "عيد ميلاد": "22 يونيو 2012 10:44:16 AM"} ، {"id: 2 ،" name ": am "} ، {" id ": 3 ،" name ":" liu bo "،" عيد ميلاد ":" 22 يونيو 2012 10:44:16 am "} ، {" id ": 3 ، am "}]} ، {" tablename ":" المعلمين "،" tabledata ": [{" id ": 1 ،" name ":" Teacher Mi "،" title ":" professor "} ، {" id ": 2 ، ////////////////////////////////////////////////////222222207 ////////////////////////////////////////////////////222222207 ////////////////////////////////////////////////////222222207 ////////////////////////////////////////////////////222222207 typetoken <list <labedata >> () {} .getType ()) ؛ لـ (int i = 0 ؛ i <labledatas2.size () ؛ i ++) {tabledata entityData = tabledatas2.get (i) ؛ string tablename = entityData.getTableName () ؛ قائمة tableData = entityData.getTabledata () ؛ String S2 = gson.tojson (tabledata) ؛ // system.out.println (S2) ؛ // system.out.println (entityData.getData ()) ؛ if (tablename.equals ("students")) {system.out.println ("students") ؛ قائمة <Tudent> RETSTULIST = gson.fromjson (s2 ، typetoken جديد <list <studture> () {} .gettype ()) ؛ لـ (int j = 0 ؛ j <retstulist.size () ؛ j ++) {system.out.println (retstulist.get (j)) ؛ }} آخر إذا (tablename.equals ("المعلمين")) {system.out.println ("المعلمين") ؛ قائمة <Sethor> retTchrlist = gson.fromjson (S2 ، typetoken جديد <list <Teacher> () {} .gettype ()) ؛ لـ (int j = 0 ؛ j <rettchrlist.size () ؛ j ++) {system.out.println (retTchrlist.get (j)) ؛ }}} // يتم تحويل json إلى كائن -> end}}نتيجة الإخراج:
[{"tablename": "الطلاب" ، "tabledata": [{"{id": 1 ، "name": "li kun" ، "عيد الميلاد": "22 يونيو ، 2012 10:04:12 PM"} ، {"id": 2 ، "name": "Cao Guisheng" ، bo "،" عيد ميلاد ":" 22 يونيو ، 2012 10:04:12 PM "} ، {" id ": 3 ،" name ": Mi "،" title ":" Professor "} ، {" id ": 2 ،" name ":" Teacher Ding "،" title ":" Lecturer "}] 22:04:12 CST 2012 ، id = 3 ، name = liu bo] مدرس المعلمين [id = 1 ، name = teacher mi ، title = professor] teacher [id = 2 ، name = teacher ding ، title = lecturer]تسجيل typeadapter والتعامل مع أنواع التعداد
أنواع التعداد تجلب فوائد لبرنامجنا. كيفية استخدام GSON لتحقيق التبادل مع JSON؟ يرجى الاطلاع على هذا المقال.
تركز هذه المقالة على كيفية كتابة typeadapter بنفسك ، وتسجيل typeadapter والتعامل مع أنواع التعداد.
فئة الكيان:
public enum packageState {play ، update ، update ، تنزيل ، تنزيل ،} فئة عامة packageItem {private string name ؛ حالة packagestate الخاصة ؛ حجم السلسلة الخاص السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } packagestate publicagestate getState () {return state ؛ } public void setState (حالة packageState) {this.state = state ؛ } getSize getSize () {حجم الإرجاع ؛ } public void setSize (size string) {this.size = size ؛ } Override Public String ToString () {return "packageItem [name =" + name + "، size =" + size + "، state =" + state + "]" ؛ }}اكتب محولًا بنفسك لتنفيذ واجهة JsonSerializer <T> و jsondeserializer <T> واجهة:
استيراد java.lang.reflect.type ؛ استيراد com.google.gson.jsondeserializationContext ؛ استيراد com.google.gson.jsondeserializer ؛ استيراد com.google.gson.jsonelement ؛ استيراد com.google.gson.jsonparseException ؛ استيراد com.google.gson.jsonprimitive ؛ استيراد com.google.gson.jsonprimitive ؛ استيراد com.google.gson.jsonserializationContext ؛ استيراد com.google.gson.jsonserializer ؛ تنفذ enumserializer من الطبقة العامة jsonserializer <PackagEstate> ، jsondeserializer <PackagEstate> {// يسمى عندما يتم تحويل الكائن إلى JSON ، وتطبيق jsonserializer <PackagEstate> interface Override public Jsonelement Serialize (حالة packagestate ، من النوع Arg1 ، jsonprimitive (state.ordinal ()) ؛ } // استدعاء عندما يتم تحويل الكائن إلى jsondeserializer <PackagEstate> Interface Override Public Packagestate Deserialize (JSonelement JSON ، Type Typeoft ، JSondeserialization Contex packageState.values () [json.getasint ()] ؛ العودة لاغية. }}فئة الاختبار:
استيراد com.google.gson.gson ؛ استيراد com.google.gson.gsonbuilder ؛ الفئة العامة gsontest6 {public static void main (string [] args) {gsonbuilder gsonbuilder = new gsonbuilder () ؛ gsonbuilder.registertypeadapter (packageState.class ، new EnumSerializer ()) ؛ gson gson = gsonbuilder.create () ؛ PackageItem item = new PackageItem () ؛ item.setName ("item_name") ؛ item.SetSize ("500m") ؛ item.setState (packageState.updating) ؛ // 这个 state 是枚举值 string s = gson.tojson (item) ؛ system.out.println (s) ؛ System.out.println ("------------------------------------") ؛ PackageItem Retitem = gson.fromjson (s ، packageitem.class) ؛ System.out.println (Retitem) ؛ }}
نتيجة الإخراج (تم تحويل نوع التعداد المقابل للحالة إلى نوع int في النتيجة):
{"name": "item_name" ، "state": 2 ، "size": "500m"} --------------------------------------------