リストやマップなどの構造に一般的に使用される変換操作は、基本的に私たちが処理するほとんどのニーズを満たすことができますが、プロジェクトには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文字列に対処するのは簡単ではないことがわかりました。この記事がどのように処理するかをご覧ください:
エンティティクラス:
Import Java.util.date;パブリッククラスの学生{private int id;プライベート文字列名;プライベートデートの誕生日; public int getid(){return id; } public void setid(int id){this.id = id; } public string getname(){return name; } public void setName(string name){this.name = name; } public date getBirthday(){return Birthday; } public void setbirthday(date Birthday){this.birthday = Birthday; } @Override public String toString(){return "desute [Birthday =" + Birthday + "、id =" + id + "、name =" + name + "]"; }} public class teacher {private int id;プライベート文字列名;プライベートストリングタイトル。 public int getid(){return id; } public void setid(int id){this.id = id; } public string getname(){return name; } public void setName(string name){this.name = name; } public string getTitle(){return title; } public void settitle(string title){this.title = title; } @Override public String toString(){return "tapery [id =" + id + "、name =" + name + "、]"; }}Tabledata Entityクラスはここで定義されていることに注意してください。
java.util.listをインポートします。パブリッククラスTabledata {private string tablename;プライベートリストTabledata; public string getTableName(){return tableName; } public void settableName(string tableName){this.tableName = tableName; } public list getTableData(){return tabledata; } public void setabledata(list tabledata){this.tabledata = tabledata; }}テストクラス:
(JSONをオブジェクトに変換する実装を注意深く見てください。ここで2回の変換の後、最初の巻き戻しの結果は、MAPが予想されるオブジェクトではないということです。MAPをJSONに再び変換した後、GSON2.1の瓶が正常に処理されることです。
java.util.arraylistをインポートします。 Import Java.util.date; java.util.listをインポートします。 com.google.gson.gsonをインポートします。 com.google.gson.reflect.typetokenをインポートします。 public class gsontest5 { / ** * @param args * / public static void main(string [] args){//オブジェクトをjsonに変換します - > state student sustent1 = new Student(); Student1.SetID(1); Student1.setName( "Li Kun"); Student1.setbirthday(new Date()); Student Student2 = new Student(); Student2.SetID(2); Student2.setName( "Cao Guisheng"); Student2.setBirthday(new Date());学生Student3 = new Student(); Student3.SetID(3); Student3.setName( "liu bo"); Student3.setbirthday(new Date());リスト<Student> Stulist = new ArrayList <Student>(); stulist.add(student1); stulist.add(student2); stulist.add(desudent3);教師教師1 = new Teacher(); Teacher1.SetID(1); Teacher1.setName( "Teacher Mi"); Teacher1.settitle( "教授");ティーチャーティーチャー2 = new Teacher(); Teacher2.SetID(2); Teacher2.setName( "Teacher Ding"); Teacher2.settitle( "講師"); list <teacher> teacherlist = new ArrayList <Teacher>(); TeacherList.Add(Teacher1); TeacherList.Add(Teacher2); tabledata td1 = new Tabledata(); td1.settablename( "desustor"); TD1.SettedAldata(Stulist); tabledata td2 = new Tabledata(); td2.settablename( "teachers"); TD2.SettedAldata(TeacherList); List <TableData> tdlist = new ArrayList <Tabledata>(); tdlist.add(td1); tdlist.add(td2); gson gson = new gson();文字列s = gson.tojson(tdlist); System.out.println(s); // result:[{"tablename": "dustore"、 "tabledata":[{"id":1、 "name": "li kun"、 "Birthday": "2012年6月10:44:16 AM"}、{"id":2、 "name": "cao guisheng"、 "birthd": " am "}、{" id ":3、" name ":" liu bo "、" Birthday ":" 2012年6月22日10:44:16 AM "}、{" id ":3、" name ":" liu bo "、" Birthday ":" 2012年6月10:44:16 am "}]}、{" tablename ":" teachers "、" tabledata ":[{" id ":1、" name ":" teacher mi "、" title ":"教授 "}、{" id ":2、" 2、 "2、" 2、 ":"先生ディン "、"タイトル ":"講師 "}}]}] ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// typetoken <list <tabledata >>(){} .getType()); for(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( "desustor")){system.out.println( "desustor"); List <Student> retstulist = gson.fromjson(s2、new typetoken <list <student >>(){} .getType()); for(int j = 0; j <retstulist.size(); j ++){system.out.println(retstulist.get(j)); }} else if(tablename.equals( "teachers")){system.out.println( "teachers"); List <Teacher> rettchrlist = gson.fromjson(s2、new typetoken <list <teacher >>(){} .getType()); for(int j = 0; j <rettchrlist.size(); j ++){system.out.println(rettchrlist.get(j)); }}} // jsonはオブジェクトに変換されます - > end}}}出力結果:
[{"TableName": "sustent"、 "tabledata":[{"id":1、 "name": "li kun"、 "Birthday": "" 2012年6月10:04:12 PM "}、{" id ":2、" name ":" cao guisheng "、" birthd ":" ":" ": bo "、"誕生日 ":" 2012年6月22日10:04:12 pm "}、{" id ":3、" name ":" liu bo "、" Birthday ":" 2012年6月10:04:12 PM "}]}、{" TableName ":" Teachers "、" Tabledata ":[{id": "先生": " mi "、" title ":" Professor "}、{" id ":2、" name ":" Teacher ding "、" title ":" lecturer "}]}]学生[誕生日=金22:04:12 CST 2012、ID = 1、name = li kun]学生[誕生日=誕生日22:04:12 CST 2012、ID 2、ID 2、ID 2、ID 2、cao 22:04:12 CST 2012、id = 3、name = liu bo]教師[id = 1、name = teacher mi、professor]教師[id = 2、name = teacher ding、title =講師]Typeadapterを登録し、列挙タイプを処理します
列挙タイプは、プログラムにメリットをもたらします。 GSONを使用してJSONとの交換を実現する方法は?この記事をご覧ください。
この記事では、Typeadapterを自分で書く方法、Typeadapterを登録し、列挙タイプを処理する方法に焦点を当てています。
エンティティクラス:
public enum packageState {play、update、update、updation、download、downloading、} public class packageitem {private string name;プライベートパッケージステート州;プライベート文字列サイズ。 public string getName(){return name; } public void setName(string name){this.name = name; } public packageState getState(){return state; } public void setState(packagestate state){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 + "]"; }}コンバーターを自分で作成して、jsonserializer <t>インターフェイスとjsondeserializer <t>インターフェイスを実装します。
java.lang.reflt.typeをインポートします。 com.google.gson.jsondErializationContextをインポートします。 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州、agrarg jsonprimivity(state.ordinal()); } //オブジェクトがjsondeserializer <packagestate> interfaceに変換されたときに呼び出されます@Override publicageState Deserialize(jsonelement json、Typeoft、jsondeserializationcontextコンテキスト)jsonparseexception {if(json.getasint()<packagestate.values()。 nullを返します。 }}テストクラス:
com.google.gson.gsonをインポートします。 com.google.gson.gsonbuilderをインポートします。 public class 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); // 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"} ----------------------------------------- PackageItem [name=item_name, size=500M, state=UPDATING]