Las operaciones de conversión comúnmente utilizadas para estructuras como la lista y el mapa pueden satisfacer básicamente la mayoría de las necesidades que manejamos, pero a veces hay regulaciones de formato especiales para JSON en el proyecto. Por ejemplo, el siguiente análisis de cadena 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":"讲师"}]}]
Después del análisis, encontramos que los métodos ordinarios no son fáciles de manejar con la cadena JSON anterior. Consulte cómo lo maneja este artículo:
Clase de entidad:
import java.util.date; Estudiante de clase pública {private int id; nombre de cadena privada; cumpleaños de cita privada; public int getId () {return id; } public void setid (int id) {this.id = id; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } Fecha pública GetBirthday () {regreso de cumpleaños; } public void setBirthday (cumpleaños de fecha) {this.birthday = cumpleaños; } @Override public string toString () {return "student [birthdle =" + birthdle + ", id =" + id + ", name =" + name + "]"; }} maestro de clase pública {private int id; nombre de cadena privada; título de cadena privada; public int getId () {return id; } public void setid (int id) {this.id = id; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } public String gettitle () {Título de retorno; } public void settitle (título de cadena) {this.title = title; } @Override public string toString () {return "maestro [id =" + id + ", name =" + name + ",]"; }}Tenga en cuenta que una clase de entidad de Tabledata se define aquí:
import java.util.list; clase pública Tabledata {String private String TableName; Lista privada Tabledata; public String getTableName () {return tableName; } public void setableName (String TableName) {this.tableName = TableName; } Lista pública getTableAtA () {return tableData; } public void SettableATA (list tableData) {this.tableData = tableData; }} Clase de prueba:
(Mire cuidadosamente la implementación de la conversión de JSON a un objeto. Después de dos conversiones aquí, el resultado del primer rebobinado es que el mapa no es el objeto que esperamos. Después de convertir el mapa nuevamente, luego convertirlo en un objeto. Lo que cité es que el JAR de GSON2.1 se maneja normalmente. Parece que el uso de GSON1.6 informa un error, por lo que se recomienda que se reornee la última versión) que use la versión) a usar la última versión).
import java.util.arrayList; import java.util.date; import java.util.list; import com.google.gson.gson; import com.google.gson.reflect.typetoken; clase pública gsontest5 { / ** * @param args * / public static void main (string [] args) {// Convertir el objeto a JSON-> Iniciar estudiante estudiantil1 = new Student (); estudiante1.setid (1); Student1.setName ("Li Kun"); Student1.setBirthday (nueva fecha ()); Estudiante estudiante2 = nuevo estudiante (); estudiante2.setid (2); Student2.SetName ("Cao Guisheng"); Student2.SetBirthday (nueva fecha ()); Estudiante estudiante3 = nuevo estudiante (); estudiante3.setid (3); student3.setName ("liu bo"); estudiante3.setbirthday (nueva fecha ()); List <druent> stulist = new ArrayList <Enstude> (); stulist.add (Student1); stulist.add (Student2); stulist.add (Student3); Profesor profesor1 = nuevo maestro (); maestro1.setid (1); maestro1.setName ("maestro mi"); maestro1.settitle ("profesor"); Profesor profesor2 = nuevo maestro (); profesor2.setid (2); profesor2.setName ("maestro ding"); profesor2.settitle ("profesor"); Lista <firector> profesorList = new ArrayList <Cermema> (); profesorList.add (maestro1); profesorList.add (profesor2); TableData td1 = new TableData (); td1.settableName ("estudiantes"); td1.settableAdata (estulista); TableData td2 = new TableData (); td2.settableName ("maestros"); TD2.SettableAtA (MaestroList); Lista <BableData> tdList = new ArrayList <BableData> (); tdList.Add (TD1); tdlist.add (td2); Gson gson = new Gson (); Cadena s = gson.tojson (tdlist); System.out.println (s); // Resultado: [{"TableName": "Estudiantes", "TableData": [{"id": 1, "Nombre": "Li Kun", "cumpleaños": "22 de junio de 2012 10:44:16 am"}, {"id": 2, "Nombre": "Cao Guisheng", "Cumpleaños": "22 de junio, 2012 10:44:16 Am "}, {" id ": 3," nombre ":" liu bo "," cumpleaños ":" 22 de junio de 2012 10:44:16 am "}, {" id ": 3," nombre ":" liu bo "," cumpleaños ":" 22 de junio, 2012 10:44:16 Am "}]}, {" TableName ":" Teachers "," TableData ": [{" id ": 1," Nombre ":" Maestro Mi "," Título ":" Profesor "}, {" Id ": 2," Nombre ":" Ding del maestro "," Título ":" Coneño "}]}] // Convertir el objeto a JSON-> end /////// //////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////// TypeToken <List <BlEdata> () {} .Gettype ()); para (int i = 0; i <tableDataS2.Size (); i ++) {Tabledata entityData = tableDataS2.get (i); String TableName = entityData.gettableName (); List tableData = entityData.gettableAdata (); Cadena s2 = gson.tojson (Tabledata); // System.out.println (S2); // system.out.println (entityData.getData ()); if (Tablename.equals ("Students")) {System.out.println ("Estudiantes"); Lista <Sentuent> Retstulist = Gson.FromJson (S2, nueva TypeToken <List <Student> () {} .Gettype ()); for (int j = 0; j <retstulist.size (); j ++) {system.out.println (retstulist.get (j)); }} else if (tableName.equals ("maestros")) {System.out.println ("maestros"); List <Capery> rettchrlist = gson.fromjson (s2, new typetoken <list <firector> () {} .gettype ()); for (int j = 0; j <rettchrlist.size (); j ++) {system.out.println (rettchrlist.get (j)); }}} // json se convierte en un objeto -> end}}Resultado de salida:
[{"TableName": "Estudiantes", "TableData": [{"id": 1, "nombre": "li kun", "cumpleaños": "22 de junio de 2012 10:04:12 pm"}, {"id": 2, "nombre": "Cao Guisheng", "cumpleaños": "22 de junio, 2012 10:04:12 PM"}, {"Id": "Nombre": "Nombre": "Nombre". Bo "," cumpleaños ":" 22 de junio de 2012 10:04:12 pm "}, {" id ": 3," nombre ":" liu bo "," cumpleaños ":" 22 de junio de 2012 10:04:12 pm "}]}}, {" Tablename ":" maestros "," Tabledata ": [" Id ": 1," Nombre ":" Teacher " Mi "," título ":" profesor "}, {" id ": 2," nombre ":" maestro ding "," título ":" profesor "}]}] Estudiantes de estudiantes [cumpleaños = viernes 22 de junio 22:04:12 CST 2012, id = 1, name = li kun] estudiante [cumpleaños = viernes 22 22:04:12 CST 2012, id = 2, name = Cao Guor 22:04:12 CST 2012, id = 3, nombre = liu bo] maestro maestro [id = 1, nombre = maestro mi, title = profesor] maestro [id = 2, nombre = maestro ding, título = profesor]Registre typeadapter y maneje los tipos de enum
Los tipos de enumeración aportan beneficios a nuestro programa. ¿Cómo usar GSON para lograr el intercambio con JSON? Consulte este artículo.
Este artículo se centra en cómo escribir un TypEadapter usted mismo, registrar Typeadapter y manejar los tipos de enum.
Clase de entidad:
public enum PackageState {Play, actualización, actualización, descarga, descarga,} public class PackageItem {Nombre de cadena privada; Estado privado de PackageState; tamaño de cadena privada; public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } public PackageState getState () {State de retorno; } public void setState (State PackageState) {this.state = state; } cadena pública getSize () {size de retorno; } public void setSize (tamaño de cadena) {this.size = size; } @Override public String toString () {return "paqueteM [name =" + name + ", size =" + size + ", state =" + state + "]"; }}Escriba un convertidor usted mismo para implementar la interfaz JSonserializer <T> y la interfaz JSondeserializer <T>:
import java.lang.reflect.type; import com.google.gson.jsondeserializationContext; import com.google.gson.jsondeserializer; import com.google.gson.jsonelement; import com.google.gson.jsonparseException; import com.google.gson.jsonprimitive; import com.google.gson.jsonprimitive; import com.google.gson.jsonserializationContext; import com.google.gson.jsonserializer; Public Class EnumSerializer implementa JSonSerializer <ActaackAgestate>, JSondeserializer <ActaackAgestate> {// llamado cuando el objeto se convierte en JSON, implementando jsonserializer <AckageState> interface @Override public jsonElement Serialize (estado packagestate, tipo arg1, jsonserializationcontextext -arg2) {return "return jsonelement serialize serialize (estado de paquete, tipo arg1, jsonserializationContextextcontext2) {return" return jsonelement serialize serialize (packagestate estado, type arg1, jsonserializationContextextContexement Serialize JSONPrimitivo (State.ordinal ()); } // llamado cuando el objeto se convierte en jsondeserializer <cackageState> interfaz @Override public PackAgestate Deserialize (JSONELEMENT JSON, Type TypeOft, JSondeserializationContext Context) lanza JSONparseException {if (json.getAsInt () <PackageState.Values (). PackageState.Values () [json.getAsInt ()]; regresar nulo; }}Clase de prueba:
import com.google.gson.gson; import com.google.gson.gsonbuilder; clase pública GSONTEST6 {public static void main (String [] args) {gsonBuilder gsonBuilder = new GsonBuilder (); GsonBuilder.RegisterTypeAdapter (PackageState.Class, New EnumSerializer ()); Gson gson = gsonbuilder.create (); Paquete de paquetes = new PackageItem (); item.setName ("item_name"); item.setsize ("500m"); item.setState (paquetegestate.updating); // 这个 estado 是枚举值 cadena s = gson.tojson (elemento); System.out.println (s); System.out.println ("--------------------------------"); Paquete de paquete retitem = gson.fromjson (s, paquete de paquete.class); System.out.println (retitem); }}
Resultado de salida (el tipo de estado de enumeración correspondiente se ha convertido en el tipo int en el resultado):
{"Nombre": "item_name", "estado": 2, "tamaño": "500m"} ----------------------------------------- paquete de paquete [name = item_name, size = 500m, state = actualización]