Hola a todos, hoy os explicaremos como podemos leer y escribir un JSON en Java.
JSON (JavaScript Object Native) nos sirve para almacenar información de distinta índole.
Realizaremos varios ejemplos, al final tienes el proyecto completo con todos los ejercicios para comprobarlos.
Vamos a trabajar inicialmente con este JSON en un fichero llamado datos.json en la raíz del proyecto:
{ "nombre": "Fernando", "apellidos": "Ureña Gomez", "edad": 29 }
Vamos a usar una biblioteca de Java llamada Gson que es de Google, que lo podéis descargar aquí.
Una vez lo tengamos importado en nuestro proyecto, lo primero que haremos es crear una instancia de Gson:
Gson gson = new Gson();
Ahora tenemos que leer ese fichero, os dejo como leerlo línea a línea:
String fichero = ""; try (BufferedReader br = new BufferedReader(new FileReader("datos.json"))) { String linea; while ((linea = br.readLine()) != null) { fichero += linea; } } catch (FileNotFoundException ex) { System.out.println(ex.getMessage()); } catch (IOException ex) { System.out.println(ex.getMessage()); }
Ahora, para obtener las propiedades haremos lo siguiente:
Properties properties = gson.fromJson(fichero, Properties.class);
IMPORTANTE: esto solo servirá si no tiene ningún array el JSON. Veremos como se hace después.
Para pintar estas propiedades, haremos esto:
System.out.println(properties.get("nombre")); System.out.println(properties.get("apellidos")); System.out.println(properties.get("edad"));
Este seria el resultado:
Lo más normal seria que guardásemos estos datos en un objeto, pues creamos una clase llamada Persona:
public class Persona { private String nombre; private String apellidos; private int edad; public Persona(String nombre, String apellidos, int edad) { this.nombre = nombre; this.apellidos = apellidos; this.edad = edad; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public String getApellidos() { return apellidos; } public void setApellidos(String apellidos) { this.apellidos = apellidos; } public int getEdad() { return edad; } public void setEdad(int edad) { this.edad = edad; } @Override public String toString() { return "Persona{" + "nombre=" + nombre + ", apellidos=" + apellidos + ", edad=" + edad + '}'; } }
Con Gson, podemos crear un objeto persona así (recuerda que ya tengo el gson creado y el fichero):
Persona persona = gson.fromJson(fichero, Persona.class); System.out.println(persona);
Este es el resultado:
También podemos hacer lo inverso, de un objeto podemos crear su JSON:
Gson gson = new Gson(); Persona persona = new Persona("F", "U", 20); String json = gson.toJson(persona); System.out.println(json);
Este es el resultado:
Como es un String se puede guardar en un JSON:
try (BufferedWriter bw = new BufferedWriter(new FileWriter("datos_persona.json"))) { bw.write(json); System.out.println("Fichero creado"); } catch (IOException ex) { Logger.getLogger(LeerJsonEj3.class.getName()).log(Level.SEVERE, null, ex); }
Como comente antes, podemos tener un array dentro del objeto:
{ "nombre":"F", "apellidos":"U", "edad":20, "asignaturas": [ { "id": 1, "nombre": "Programación" }, { "id": 2, "nombre": "Despliegues web" } ] }
Dentro de ese array, estamos metiendo objetos de tipo asignatura:
public class Asignatura { private int id; private String nombre; public Asignatura(int id, String nombre) { this.id = id; this.nombre = nombre; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } @Override public String toString() { return "Asignatura{" + "id=" + id + ", nombre=" + nombre + '}'; } }
Actualizamos la clase de persona, añadiéndole un array de Asignaturas:
package leerjson; import java.util.ArrayList; public class Persona { private String nombre; private String apellidos; private int edad; private ArrayList<Asignatura> asignaturas; public Persona(String nombre, String apellidos, int edad) { this.nombre = nombre; this.apellidos = apellidos; this.edad = edad; this.asignaturas = new ArrayList(); } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public String getApellidos() { return apellidos; } public void setApellidos(String apellidos) { this.apellidos = apellidos; } public int getEdad() { return edad; } public void setEdad(int edad) { this.edad = edad; } public ArrayList<Asignatura> getAsignaturas() { return asignaturas; } public void setAsignaturas(ArrayList<Asignatura> asignaturas) { this.asignaturas = asignaturas; } @Override public String toString() { return "Persona{" + "nombre=" + nombre + ", apellidos=" + apellidos + ", edad=" + edad + ", asignaturas=" + asignaturas + '}'; } }
Entonces, si hacemos el anterior ejemplo deberíamos ver este resultado:
Podéis descargar el proyecto completo por aquí.
También os dejo un video donde hablo del tema:
Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.
Como se puede hacer si en el archivo json tenemos una lista de objetos?