En términos sencillos, Jackson es una biblioteca de clases Java que se utiliza para procesar datos en formato JSON y su rendimiento es muy bueno. Este artículo brindará un análisis de ejemplo más detallado del uso de Jackson. Los detalles son los siguientes:
1. Introducción
Jackson tiene una eficiencia de serialización y deserialización relativamente alta Según las pruebas, no importa qué forma de conversión, Jackson> Gson> Json-lib, y el poder de procesamiento de Jackson es incluso casi 10 veces mayor que el de Json-lib, y el sexo también es correcto. muy alto. Por el contrario, Json-lib parece haber dejado de actualizarse y la última versión también se basa en JDK15, mientras que la comunidad de Jackson es más activa.
A continuación, presentaremos brevemente el uso de Jackson con ejemplos.
2. uso
Jackson proporciona muchas clases y métodos, y la clase más utilizada en serialización y deserialización es la clase ObjectMapper, que es similar a JsonObject y ArrayObject en Json-lib. Esta clase proporciona métodos como readTree(), readValue(), writeValueAsString() para la conversión. La dirección de documentación específica para esta clase es: http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html.
Para evitar descripciones repetidas, el objectMapper mencionado a continuación proviene de ObjectMapper objectMapper = new ObjectMapper(). El uso se presentará brevemente a continuación en términos de serialización y deserialización.
1. Serialización
① Serializar las clases propias de Java
Ejemplo de prueba
Lista lista=new ArrayList();list.add(1);list.add(2);list.add(3);
Implementar serialización:
Cadena teststringlist=objectMapper.writeValueAsString(lista);System.out.println(teststringlist);
El resultado resultante en la consola es:
[1,2,3]
en conclusión:
Jackson puede implementar fácilmente la serialización de tipos generales.
②Serialización de clases personalizadas
Ejemplo de prueba:
estudiante de clase pública {private int age=10;private String name="hhh"; public String[] list={"hao","haouhao","keyi"}; public int getAge; () { regresar edad; } public void setAge(int edad) { this.age = edad } public String getName() { return nombre } public void setName(String nombre) { this.name = nombre; }}
Para hacer el ejemplo más general, esta clase incluye el tipo de valor int, el tipo de referencia String, String[] y el tipo de fecha Date.
Implementar serialización
estudiante st=nuevo estudiante();String teststringstu=objectMapper.writeValueAsString(st);System.out.println(teststringstu);
El resultado resultante en la consola es:
{"lista":["hao","haouhao","keyi"],"tiempo":1375429228382,"nombre":"hhh","edad":10}
en conclusión:
A través del resultado, se puede ver que la cadena Json convertida se ajusta al formato. Sin embargo, la representación del tiempo es un poco deficiente. Las modificaciones al formato de hora se introducirán a continuación.
③Definición de formato de hora
Jackson tiene su propio formato de hora predeterminado, que es en forma de marcas de tiempo, y su efecto es como se muestra en los resultados anteriores (por ejemplo: 1375429228382). Si desea establecer que este formato no sea válido, pase
objectMapper.configure (SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, falso)
Se puede configurar para que la generación de hora utilice la notación compatible con [ISO-8601], generando una hora similar al siguiente formato: "1970-01-01T00:00:00.000+0000".
Por supuesto, también puedes personalizar el formato de hora de salida.
Implementación de formato de hora personalizado.
El ejemplo también utiliza la clase de estudiantes presentada anteriormente.
estudiante st=nuevo estudiante();java.text.DateFormat myFormat = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");objectMapper.getSerializationConfig().setDateFormat(myFormat);String teststringstu= objectMapper.writeValueAsString(st);System.out.println(teststringstu);
La salida de demérito en la consola es:
{"lista":["hao","haouhao","keyi"],"tiempo":"2013-08-02 03:48:20","nombre":"hhh","edad":10}
en conclusión:
Se puede ver que el formato de salida de hora se ha convertido en el que queremos. El método para definir el formato de salida de hora en Jackson es mucho más simple que definir el formato de hora en Json-lib.
④ Otro método de serialización
Implementar serialización
El ejemplo utilizado sigue siendo la clase de estudiante anterior.
estudiante st=nuevo estudiante();JsonGenerator jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);jsonGenerator.writeObject(st; System.out.println());
La salida en la consola es:
{"lista":["hao","haouhao","keyi"],"tiempo":1375429228382,"nombre":"hhh","edad":10}
en conclusión:
Este método también puede obtener el valor del método anterior. Pero preste atención a esta función en este método: createJsonGenerator (), que requiere dos parámetros, uno es el parámetro de tipo OutputStream y el otro es el parámetro de tipo JsonEncoding. A través de estos dos parámetros, podemos entender que este método no solo puede escribir Json directamente en el flujo de la red, sino también escribir Json en el flujo de archivos o en el flujo de memoria. Entonces es más versátil.
2. Deserialización
①Deserialización única
Este método utiliza principalmente el método <testJsonClass> readValue(String content, Class<testJsonClass> valueType) proporcionado por ObjectMapper. Este método requiere ingresar una cadena Json y la Clase correspondiente de la clase que debe completarse, y devuelve la clase completa.
Analizar la cadena Json en una clase personalizada
Cuando la cadena Json es:
Cadena test1="{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.9150390625}]}"
tiempo.
Primero defina una clase:
clase pública testJsonClass { public int objectID lista pública geoPoints=new ArrayList();}
Luego use el siguiente fragmento de código para deserializar Json en esta clase:
testJsonClass testClass= objectMapper.readValue(test1, testJsonClass.class);
usar
System.out.println(testClass.objectID);System.out.println(testClass.geoPoints)
Los valores que puede ver en la salida de la consola son:
357[{x=504604.59802246094, y=305569.9150390625}]
Deserialice la cadena Json en la clase propia del sistema. Cuando la cadena Json sea.
Cadena json = "{"error":0,"datos":{"nombre":"ABC","edad":20,"teléfono":{"casa":"abc","móvil":"def"}," amigos":[{"nombre":"DEF","teléfono" :{"home":"hij","mobile":"klm"}},{"name":"GHI","phone":{"home":"nop","mobile":"qrs"} }]},"otro":{"apodo":[]}}".
Defina una variable utilizando el mapa propio del sistema: mapas Map<String, Map<String, Object>>. Luego use mapas = objectMapper.readValue(json, Map.class) para deserializar Json en los mapas de variables.
aprobar
System.out.println(maps.get("error"));System.out.println((Objeto)(maps.get("datos").get("teléfono")))
Puede obtener los siguientes resultados en la consola:
0{casa=abc, móvil=def}
②Deserialización gradual
Este método es más flexible y puede extraer solo el valor de información de la cadena Json que le interesa al usuario. Se implementa principalmente utilizando readTree proporcionado por ObjectMapper y la clase JsonNode proporcionada por Jackson.
Ejemplo de prueba
Cadena test="{"resultados":[{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.915039 0625}]},{"objectID":358,"geoPoints":[{"x":504602.2680053711,"y":305554.43603515625}]}]}";
Esta cadena Json es relativamente compleja, incluida la forma de matriz anidada, y es universal.
Implementar la deserialización
JsonNode node= objectMapper.readTree(test); //Lee la cadena Json en la memoria en una estructura de árbol JsonNodecontent=node.get("results");//Obtiene la información en el nodo de resultados for(int i=0 ; i<contenido.tamaño();i++) // Recorre la información en los resultados, la función size() puede obtener la cantidad de información contenida en el nodo, similar a la longitud de la matriz {System.out.println(contents.get(i).get("objectID" ). getIntValue()); //Leer el valor de un nodo secundario bajo el nodo JsonNode geoNumber=contents.get(i).get("geoPoints");for(int). j=0;j<geoNumber.size();j++) //Recorre la información debajo de los nodos secundarios {System.out.println(geoNumber.get(j).get("x").getDoubleValue()+" " +geoNumber.get(j).get("y").getDoubleValue());}}
La salida en la consola es:
357504604.59802246094 305569.9150390625358504602.2680053711 305554.43603515625
en conclusión:
Este método es similar al análisis DOM en el análisis XML. La ventaja es que la estructura es detallada, lo que facilita la extracción de la información deseada. Por supuesto, la desventaja es la misma que la de este método: requiere tiempo y espacio.
3. Resumen
Las operaciones de Jackson en Json son principalmente las que se muestran arriba. Su método es muy conveniente de usar y muy flexible. Proporciona operaciones únicas y operaciones que pueden leer información bajo demanda. Y Jackson tiene una gama completa de funciones, que pueden controlar la serialización y deserialización en varios detalles, como la función de anotación, la función de inyección retardada para Hibernate y la función de configuración del formato de hora. Debido a que estas funciones no son necesarias actualmente, estudíelas detenidamente. para más tarde. Al mismo tiempo, Jackson también admite una serie de operaciones de serialización y deserialización en XML. La idea es aproximadamente la misma que analizar Json.
Con respecto a las deficiencias actuales de Jackson, algunas personas en Internet han probado que ocupa más memoria que Json-lib. Generalmente vale la pena usar el espacio por tiempo.