Después de publicar más de 50 publicaciones de blog de actualización, hemos reunido suficientes comentarios que a muchos desarrolladores les encantaría una introducción extensa al Gson de Google. Gson es una biblioteca muy potente para asignar estructuras de datos representadas como JSON a objetos Java. Por supuesto, también es compatible al revés y puede crear una representación JSON adecuada de sus objetos Java.
Si está interesado en hacia dónde va esta serie, consulte nuestro esquema de la serie:
Descripción general de la serie Gson
Dependencia de Gson
Esta guía será práctica y comenzará con un poco de serialización en un minuto. Dado que muchos de nuestros lectores son desarrolladores de Android, lo adaptaremos a ti, pero Gson se puede usar en cualquier entorno Java. Antes de que podamos empezar, necesitamos incorporar la biblioteca Gson a nuestro proyecto. En el momento de escribir este artículo, la última versión es 2.8.5
. Si estás usando Gradle, agrega la siguiente línea:
implementation 'com.google.code.gson:gson:2.8.5'
Si estás usando Maven, puedes agregar la siguiente dependencia:
<dependencies> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.5</version> <scope>compile</scope> </dependency></dependencies>
Para los pobres que no usan ningún sistema de gestión de dependencias, puedes descargar el jar en el repositorio oficial de GitHub.
Fundamentos de la serialización Java-JSON
¡Así que vamos a hacer un poco de serialización! La serialización en el contexto de Gson significa asignar un objeto Java a su representación JSON. En los siguientes tutoriales, nuestros datos se volverán más complejos, pero por ahora comenzaremos con un objeto UserSimple
muy simple:
public class UserSimple { String name; String email; int age; boolean isDeveloper;}
El objeto user tiene cuatro propiedades:
- El
name
del usuario es un objeto de cadena - El
email
del usuario también es un objeto de cadena - El
age
del usuario es un entero, lo que significa que la edad se almacena en años (por ejemplo,26
y no el cumpleaños exacto!) - Finalmente una bandera booleana
isDeveloper
Nuestra aplicación Android o Java necesita convertir un objeto UserSimple
a su representación JSON. Suponiendo que mantengamos los nombres de los miembros iguales, esperaríamos un JSON de este tipo para Norman, el autor de esta publicación de blog:
{ "name": "Norman", "email": "[email protected]", "age": 26, "isDeveloper": true}
Veamos cómo podemos hacer la conversión con Gson. En primer lugar, necesitamos crear un objeto Java para Norman:
UserSimple userObject = new UserSimple( "Norman", "[email protected]", 26, true);
Para hacer la serialización, necesitamos un objeto Gson
, que maneja la conversión. Simplemente podemos usar el constructor:
Gson gson = new Gson();
A continuación, necesitamos llamar a la función toJson()
y pasar el objeto UserSimple
:
String userJson = gson.toJson(userObject);
El objeto userJson
contiene el siguiente valor:
{ "age": 26, "email": "[email protected]", "isDeveloper": true, "name": "Norman"}
Gson cambió el orden de las propiedades (a alfabético), ¡pero el contenido es idéntico! Observe cómo Gson respetó los tipos. Los valores de cadena estaban envueltos en ""
, mientras que los valores enteros no tenían envoltura. No tuvimos que perder el tiempo con objetos JSON
o copiar miembros individuales. Una sola llamada a Gson fue suficiente para mapear todo el objeto. Esto es extremadamente útil cuando trabajamos con estructuras de datos complejas. Pero antes de ir demasiado profundo, probemos la otra dirección. ¿Puede Gson crear un objeto Java a partir del JSON anterior?
Fundamentos de la deserialización JSON-Java
En primer lugar, necesitamos crear una cadena, que contenga el JSON mencionado anteriormente:
String userJson = "{'age':26,'email':'[email protected]','isDeveloper':true,'name':'Norman'}";
Cambiamos "
a '
para evitar que se escaparan toneladas de \"
. Sin embargo, funciona de cualquier manera. El siguiente paso es, como probablemente haya adivinado, crear una instancia Gson:
Gson gson = new Gson();
Finalmente, tenemos que mapear de un objeto JSON a un objeto Java con fromJson()
:
UserSimple userObject = gson.fromJson(userJson, UserSimple.class);
Observe cómo debemos pasar el objeto Java esperado como segundo parámetro. De lo contrario, Gson no sabe a qué debe mapear el JSON. No es un mago!
Si adjuntamos un depurador y verificamos el resultado userObject
, nos mostrará que Gson mapeó correctamente todas las propiedades correctamente:
En esta publicación de introducción, ha visto el uso básico de Gson. Hemos mostrado lo fácil que es mapear desde y hacia datos JSON. Estamos seguros de que tiene un montón de preguntas en este momento:
- ¿Las clases del modelo Java necesitan un constructor / getter / setter?
- ¿Los campos del modelo Java pueden ser privados?
- ¿Cómo se manejan los valores nulos?
- ¿Qué pasa si la clase Java tiene nombres de miembros diferentes a los del JSON?
- Cómo (des)serializar matrices/listas de objetos
- Cómo (des)serializar objetos anidados
- ¿Gson mantiene un valor predeterminado definido para una propiedad de clase mientras ejecuta
.fromJson()
y no hay ningún valor para esa propiedad disponible en JSON?
No te preocupes, llegaremos a todos ellos en las próximas semanas. Si tienes un tema específico en mente, háznoslo saber en los comentarios o en twitter @futurestud_io.
Make it rock & ¡disfruta de la programación!
¿Aún no eres un Experto? ¡Consigue Nuestro Libro Gson!
El mapeo de JSON a objetos Java (y viceversa) es de los años 90. Gson es la solución moderna para mapear entre Java y JSON automáticamente con un esfuerzo mínimo.
¡Solo necesita saber cómo hacerlo! Conozca todos los detalles sobre las capacidades de Gson, configuración & personalización en nuestro libro.
Nuestro libro contiene todo lo que necesita saber sobre Gson. Valore su tiempo y ahorre de interminables horas de búsquedas en Google para solucionar rápidamente sus problemas. Invierta en su conocimiento por adelantado y en una solución limpia. Te convertiremos en el experto en Gson de tu equipo.
Incluye un libro de trabajo!