การดำเนินการแปลงที่ใช้กันทั่วไปสำหรับโครงสร้างเช่นรายการและแผนที่สามารถตอบสนองความต้องการส่วนใหญ่ที่เราจัดการได้ แต่บางครั้งก็มีกฎระเบียบรูปแบบพิเศษสำหรับ 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; นักศึกษาชั้นเรียนสาธารณะ {ID INT ส่วนตัว; ชื่อสตริงส่วนตัว; วันเกิดส่วนตัววันเกิด; สาธารณะ int getId () {return id; } โมฆะสาธารณะ setId (int id) {this.id = id; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } วันที่สาธารณะ getBirthday () {ส่งคืนวันเกิด; } โมฆะสาธารณะ setBirthday (วันเกิดวันที่) {this.birthday = วันเกิด; } @Override สตริงสาธารณะ toString () {return "นักเรียน [วันเกิด =" + วันเกิด + ", id =" + id + ", name =" + name + "]"; }} ครูชั้นเรียนสาธารณะ {ID INT ส่วนตัว; ชื่อสตริงส่วนตัว; ชื่อสตริงส่วนตัว; สาธารณะ int getId () {return id; } โมฆะสาธารณะ setId (int id) {this.id = id; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } สตริงสาธารณะ getTitle () {return title; } โมฆะสาธารณะ settitle (ชื่อสตริง) {this.title = title; } @Override สตริงสาธารณะ toString () {return "ครู [id =" + id + ", name =" + name + ",]"; -โปรดทราบว่ามีการกำหนดคลาสเอนทิตีของ TableData ที่นี่:
นำเข้า java.util.list; Public Class Tapledata {Tablename String ส่วนตัว; รายการส่วนตัว Tapledata; สตริงสาธารณะ getTableName () {return tablename; } โมฆะสาธารณะ setTabLEname (String tablename) {this.tablename = tablename; } รายการสาธารณะ getTabledata () {return tableData; } โมฆะสาธารณะ setabledata (รายการ tableData) {this.tabledata = tabledata; - คลาสทดสอบ:
(ดูอย่างระมัดระวังในการดำเนินการแปลง JSON กลับไปเป็นวัตถุหลังจากการแปลงสองครั้งที่นี่ผลลัพธ์ของการย้อนกลับครั้งแรกคือแผนที่ไม่ใช่วัตถุที่เราคาดหวังหลังจากแปลงแผนที่เป็น JSON อีกครั้ง
นำเข้า java.util.arraylist; นำเข้า java.util.date; นำเข้า java.util.list; นำเข้า com.google.gson.gson; นำเข้า com.google.gson.reflect.typetoken; คลาสสาธารณะ GNONTEST5 { / ** * @param args * / โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// แปลงวัตถุเป็น JSON-> Start Students Student1 = นักเรียนใหม่ (); student1.setId (1); student1.setName ("Li Kun"); student1.setBirthday (วันที่ใหม่ ()); นักเรียนนักเรียน 2 = นักเรียนใหม่ (); student2.setId (2); student2.setName ("Cao Guisheng"); student2.setBirthday (วันที่ใหม่ ()); นักเรียนนักเรียน 3 = นักเรียนใหม่ (); student3.setid (3); student3.setName ("Liu Bo"); student3.setBirthday (วันที่ใหม่ ()); รายการ <student> stulist = new ArrayList <Tudent> (); Stulist.add (Student1); Stulist.add (Student2); stulist.add (นักเรียน 3); ครูครู 1 = ครูใหม่ (); ครู 1.SetId (1); ครู 1.SetName ("ครู MI"); ครู 1.Settitle ("ศาสตราจารย์"); ครูครู 2 = ครูใหม่ (); ครู 2.SetId (2); อาจารย์ 2.setName ("ครู ding"); อาจารย์ 2.settitle ("อาจารย์"); รายการ <Teacher> TeacherList = New ArrayList <Teacher> (); Teacherlist.add (ครู 1); Teacherlist.add (ครู 2); Tabledata td1 = ใหม่ tabledata (); td1.settablename ("นักเรียน"); td1.settabledata (stulist); Tabledata td2 = ใหม่ tabledata (); td2.settablename ("ครู"); td2.settabledata (Teacherlist); รายการ <PlEdata> tdList = new ArrayList <Predata> (); tdlist.add (TD1); tdlist.add (TD2); GSON GSON = New GSON (); สตริง s = gson.tojson (tdlist); System.out.println (s); // ผลลัพธ์: [{"tablename": "นักเรียน", "tabledata": [{"id": 1, "ชื่อ": "Li Kun", "วันเกิด": "Jun 22, 2012 10:44:16 AM"}, {"ID": 2, "ชื่อ": "Cao Guisheng" Am "}, {" id ": 3," ชื่อ ":" Liu Bo "," วันเกิด ":" 22 มิ.ย. 2012 10:44:16 AM "}, {" id ": 3," ชื่อ ":" Liu Bo "," วันเกิด ": Am "}]}, {" tablename ":" ครู "," tabledata ": [{" id ": 1," ชื่อ ":" ครู Mi "," ชื่อ ":" ศาสตราจารย์ "}, {" id ": 2," ชื่อ " - - - - typetoken <list <tabledata>> () {} .getType ()); สำหรับ (int i = 0; i <tabledatas2.size (); i ++) {tabledata entityData = tableDatas2.get (i); String tablename = entityData.getTableName (); รายการ tableData = entityData.getTableData (); สตริง s2 = gson.tojson (tabledata); // system.out.println (S2); // system.out.println (entityData.getData ()); if (tablename.equals ("นักเรียน")) {system.out.println ("นักเรียน"); รายการ <student> retstulist = gson.fromjson (s2, typetoken ใหม่ <list <student>> () {} .getType ()); สำหรับ (int j = 0; j <retstulist.size (); j ++) {system.out.println (retstulist.get (j)); }} อื่นถ้า (tablename.equals ("ครู")) {system.out.println ("ครู"); รายการ <Teacher> 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, "ชื่อ": "Li Kun", "วันเกิด": "Jun 22, 2012 10:04:12 PM"}, {"ID": 2, "ชื่อ": "Cao Guisheng" Bo "," วันเกิด ":" 22 มิ.ย. 2012 10:04:12 PM "}, {" id ": 3," ชื่อ ":" Liu Bo "," วันเกิด ":" Jun 22, 2012 10:04:12 PM "}}, {" Tablename ":" ครู "," Tabledata ": mi "," title ":" ศาสตราจารย์ "}, {" id ": 2," ชื่อ ":" ครู ding "," title ":" อาจารย์ "}]}] นักเรียนนักเรียน [วันเกิด = ศุกร์ 22:04:12 cst 2012, id = 1, ชื่อ = li kun] นักเรียน 22:04:12 CST 2012, ID = 3, ชื่อ = Liu Bo] ครูครู [ID = 1, ชื่อ = ครู MI, ชื่อเรื่อง = ศาสตราจารย์] ครู [ID = 2, ชื่อ = ครู ding, ชื่อ = อาจารย์]ลงทะเบียน typeadapter และจัดการประเภท enum
ประเภทการแจงนับนำประโยชน์มาสู่โปรแกรมของเรา จะใช้ GSON เพื่อให้ได้การแลกเปลี่ยนกับ JSON ได้อย่างไร? โปรดดูบทความนี้
บทความนี้มุ่งเน้นไปที่วิธีการเขียน typeadapter ด้วยตัวเองลงทะเบียน typeadapter และจัดการประเภท enum
ระดับเอนทิตี:
Public Enum PackageState {play, update, updating, downloading,} Public Class PackageItem {ชื่อสตริงส่วนตัว; Private PackageState State; ขนาดสตริงส่วนตัว สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } PublicageState getState () {return state; } โมฆะสาธารณะ setState (สถานะ packageState) {this.state = state; } สตริงสาธารณะ getSize () {ขนาดคืน; } โมฆะสาธารณะ setsize (ขนาดสตริง) {this.size = size; } @Override สตริงสาธารณะ 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; Public Class Enumserializer ใช้ JSonserializer <PackageState>, JSondeserializer <PackageState> {// เรียกว่าเมื่อวัตถุถูกแปลงเป็น JSON, การใช้งาน jSonserializer <PackageState> อินเตอร์เฟส @Override jsonElement Public jsonprimitive (state.ordinal ()); } // เรียกว่าเมื่อวัตถุถูกแปลงเป็น jSondeserializer <packageState> อินเตอร์เฟส @Override public PackageState deserialize (jsonElement JSON, typeoft, jSondeserialization Context) โยน jsonparsexception {ถ้า json.getasint () PackageState.values () [json.getasint ()]; คืนค่า null; -คลาสทดสอบ:
นำเข้า com.google.gson.gson; นำเข้า com.google.gson.gsonbuilder; ระดับสาธารณะ GNONTEST6 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {gsonBuilder gsonBuilder = new gsonBuilder (); gsonbuilder.registertypeadapter (packageState.class, ใหม่ 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 (รายการ); System.out.println (s); System.out.println ("--------------------------------"); packageItem retitem = gson.fromjson (s, packageItem.class); System.out.println (retitem); -
ผลลัพธ์ผลลัพธ์ (ประเภทการแจงนับที่สอดคล้องกันของสถานะได้รับการแปลงเป็นประเภท int ในผลลัพธ์):
{"ชื่อ": "item_name", "state": 2, "size": "500m"} ----------------------------------------- packageItem [name = item_name, size = 500m, state = updating]