Operasi konversi yang umum digunakan untuk struktur seperti daftar dan peta pada dasarnya dapat memenuhi sebagian besar kebutuhan yang kami tangani, tetapi kadang -kadang ada peraturan format khusus untuk JSON dalam proyek. Misalnya, parsing string JSON berikut:
[{"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":"讲师"}]}]
Setelah analisis, kami menemukan bahwa metode biasa tidak mudah untuk berurusan dengan string JSON di atas. Silakan lihat bagaimana artikel ini menanganinya:
Kelas Entitas:
impor java.util.date; siswa kelas publik {private int id; nama string pribadi; ulang tahun kencan pribadi; publik int getId () {return id; } public void setid (int id) {this.id = id; } public string getName () {return name; } public void setName (name string) {this.name = name; } tanggal publik getBirthday () {kembali ulang tahun; } public void setBirthday (tanggal ulang tahun) {this.birthday = ulang tahun; } @Override Public String ToString () {return "Student [ulang tahun =" + ulang tahun + ", id =" + id + ", name =" + name + "]"; }} guru kelas publik {private int id; nama string pribadi; judul string pribadi; publik int getId () {return id; } public void setid (int id) {this.id = id; } public string getName () {return name; } public void setName (name string) {this.name = name; } public String getTitle () {return title; } public void setTitle (string title) {this.title = title; } @Override Public String ToString () {return "Teacher [id =" + id + ", name =" + name + ",]"; }}Perhatikan bahwa kelas entitas TableData didefinisikan di sini:
impor java.util.list; TableData kelas publik {Private String Tablename; daftar pribadi TableData; string publik getTableName () {return tableName; } public void settableName (string tableName) {this.tableName = tableName; } daftar publik gettableData () {return tableData; } public void settableData (daftar tableData) {this.tabledata = tableData; }} Kelas Tes:
(Lihatlah dengan cermat implementasi Konversi JSON kembali ke suatu objek. Setelah dua konversi di sini, hasil dari pemindahan pertama adalah bahwa peta bukanlah objek yang kami harapkan. Setelah mengonversi peta ke JSON lagi, kemudian mengubahnya menjadi objek. Apa yang saya kutip adalah bahwa toples GSON2.1 ditangani secara normal. Sepertinya itu menggunakan Jar dari Gson1.6 akan ditangani secara normal. Sepertinya itu menggunakan Jar dari Gson1.6.
impor java.util.arraylist; impor java.util.date; impor java.util.list; impor com.google.gson.gson; impor com.google.gson.reflect.typetoken; kelas publik gsontest5 { / ** * @param args * / public static void main (string [] args) {// mengonversi objek menjadi json-> student student1 = new student (); Student1.setid (1); Student1.setname ("Li Kun"); student1.setBirthday (tanggal baru ()); Siswa Siswa2 = Siswa Baru (); Student2.setid (2); Student2.setname ("Cao Guisheng"); student2.setBirthday (tanggal baru ()); Siswa Siswa3 = Siswa Baru (); student3.setid (3); student3.setname ("Liu Bo"); student3.setbirthday (tanggal baru ()); Daftar <Sahasiswa> stulist = new ArrayList <shongents> (); stulist.add (student1); stulist.add (student2); stulist.add (student3); Guru guru1 = guru baru (); guru1.setid (1); Teacher1.setname ("Teacher MI"); Teacher1.Settitle ("Profesor"); Guru guru2 = guru baru (); guru2.setid (2); guru2.setname ("Teacher Ding"); guru2.settitle ("Dosen"); Daftar <Gell Teacher> Daftar Guru = Daftar Arraylist Baru <Gell Teacher> (); TeacherList.Add (Teacher1); TeacherList.Add (Teacher2); TableData TD1 = TableData baru (); td1.setablename ("siswa"); td1.settableData (stulist); TableData TD2 = TableData baru (); td2.setablename ("guru"); TD2.SetTableData (Daftar Guru); Daftar <labelata> tdlist = new ArrayList <labledata> (); tdlist.add (td1); tdlist.add (td2); GSON GSON = GSON baru (); String s = gson.toJson (tdlist); System.out.println (s); // Hasil: [{"Tablename": "Siswa", "TableData": [{"id": 1, "Name": "Li Kun", "Ulang Tahun": "22 Jun 2012 10:44:16 AM"}, {"Id": 2, "Name": "Cao Guisheng", "Ulang Tahun": "Juni 22, 2012:" Juni 10:4: "Juni 10:4:" Juni 22: "Jun 22:" Juni 22: "Juni 22:" Jun 22: "Jun 22:" Jun 22: "Jun 22:" Jun 22, Am "}, {" id ": 3," name ":" liu bo "," ulang tahun ":" 22 Jun 2012 10:44:16 "}, {" id ": 3," name ":" Liu bo "," ulang tahun ":" 22 Jun 2012 10:44:16 AM"}]},{"tableName":"teachers","tableData":[{"id":1,"name":"Teacher Mi","title":"Professor"},{"id":2,"name":"Teacher Ding","title":"Lecturer"}]}] // Convert the object to Json-->end // //////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////// Typetoken <list <labledata>> () {} .getType ()); untuk (int i = 0; i <tableDataS2.size (); i ++) {TableData entityData = tableDataS2.get (i); String tableName = entityData.gettableName (); Daftar TableData = entityData.getTableData (); String s2 = gson.toJson (tableData); // System.out.println (S2); // System.out.println (entityData.getData ()); if (tableName.equals ("siswa")) {System.out.println ("Siswa"); Daftar <Sahasiswa> retstulist = gson.fromjson (S2, typetoken baru <Daftar <spinition> () {} .getType ()); untuk (int j = 0; j <retstulist.size (); j ++) {System.out.println (retstulist.get (j)); }} lain jika (tableName.equals ("guru")) {System.out.println ("guru"); Daftar <Gell Teacher> rettchrlist = gson.fromjson (S2, typetoken baru <Daftar <Gell Teacher> () {} .getType ()); untuk (int j = 0; j <rettchrrlist.size (); j ++) {System.out.println (rettchrlist.get (j)); }}} // json dikonversi ke objek -> end}}Hasil output:
[{"Tablename": "Siswa", "TableData": [{"Id": 1, "Name": "Li Kun", "Ulang Tahun": "22 Jun 2012 10:04:12 PM"}, {"id": "NAME": "CAO GUISHENG", "Ulang Tahun": "Jun 22, 2012," "" "" "" "" "" "" "" "" "" "" "" "name": "2," 2, "" "," "" "," "2," NOME ":" 2, "" "2," "2," "NAME": "" " Bo "," ulang tahun ":" 22 Jun 2012 10:04:12 PM "}, {" id ": 3," name ":" liu bo "," ulang tahun ":" 22 Jun 2012 10:04:12 PM "}]}, {" Tablename ":" Guru "," TableData ": [" ID ": 1, 1, 1, 1, 1," ID ": 1," ID ":" ID ":" ID ":" ID ":" ID ": [" ID ":" ID ": [{" ID ": {{" {"ID": [{":" Mi","title":"Professor"},{"id":2,"name":"Teacher Ding","title":"Lecturer"}]}] students Student [birthDay=Fri Jun 22 22:04:12 CST 2012, id=1, name=Li Kun] Student [birthDay=Fri Jun 22 22:04:12 CST 2012, id=2, name=Cao Guisheng] Student [birthDay=Fri Jun 22 22:04:12 CST 2012, id = 3, name = liu bo] guru guru [id = 1, nama = guru mi, judul = profesor] guru [id = 2, nama = guru ding, judul = dosen]Daftarkan Typeadapter dan Tangani Jenis Enum
Jenis Pencacahan membawa manfaat bagi program kami. Bagaimana cara menggunakan GSON untuk mencapai pertukaran dengan JSON? Silakan lihat artikel ini.
Artikel ini berfokus pada cara menulis typeadapter sendiri, mendaftar TypeAdapter dan menangani jenis enum.
Kelas Entitas:
public enum packagestate {play, update, updating, download, download,} public class packageItem {private string name; Negara Bagian Private Packagestate; ukuran string pribadi; public string getName () {return name; } public void setName (name string) {this.name = name; } public packagestate getState () {return state; } public void setState (status packagestate) {this.state = state; } public string getSize () {return size; } public void setSize (string size) {this.size = size; } @Override public string toString () {return "packageItem [name =" + name + ", size =" + size + ", state =" + state + "]"; }}Tulis sendiri konverter untuk mengimplementasikan antarmuka JSonserializer <T> dan antarmuka jsondeserializer <T>:
impor java.lang.reflect.type; impor com.google.gson.jsondeserializationContext; impor com.google.gson.jsondeserializer; impor com.google.gson.jsonelement; impor com.google.gson.jsonparseexception; impor com.google.gson.jsonprimitive; impor com.google.gson.jsonprimitive; impor com.google.gson.jsonserializationContext; impor com.google.gson.jsonserializer; public class EnumSerializer implements JsonSerializer<PackageState>, JsonDeserializer<PackageState> { // Called when the object is converted to Json, implementing JsonSerializer<PackageState> interface @Override public JsonElement serialize(PackageState state, Type arg1, JsonSerializationContext arg2) { return new Jsonprimitive (state.ordinal ()); } // Dipanggil kapan objek dikonversi ke jsondeserializer <packagestate> antarmuka @Override public packagestate deserialize (jsonelement json, type typeoft, jsondeserialization context konteks) melempar jsonparseexception {if (json.getasint () <packagestate.values {if (json.getasint () <packagestate.values {if). Packagestate.values () [json.getasint ()]; kembali nol; }}Kelas Tes:
impor com.google.gson.gson; impor com.google.gson.gsonbuilder; kelas publik gsontest6 {public static void main (string [] args) {gsonbuilder gsonbuilder = new gsonbuilder (); gsonbuilder.registertypeadapter (packagestate.class, enumserializer baru ()); Gson gson = gsonbuilder.create (); Item packageItem = packageItem baru (); item.setname ("item_name"); item.setsize ("500m"); item.setState (packagestate.updating); // 这个 status 是枚举值 string s = gson.toJson (item); System.out.println (s); System.out.println ("--------------------------------"); PackageItem retitem = gson.fromjson (s, packageitem.class); System.out.println (Retitem); }}
Hasil output (tipe enumerasi yang sesuai telah dikonversi menjadi tipe int dalam hasilnya):
{"name": "item_name", "state": 2, "size": "500m"} ----------------------------------------- packageItem [name = item_name, size = 500m, state = memperbarui]