Cómo leer un archivo JSON desde una ruta relativa en Java

JavaBeginner
Practicar Ahora

Introducción

En el desarrollo moderno de Java, el manejo de JSON (JavaScript Object Notation) es una habilidad fundamental. JSON es el estándar de facto para el intercambio de datos en aplicaciones web y APIs debido a su formato legible por humanos y su facilidad de análisis por parte de las máquinas.

Este tutorial proporciona una guía completa para leer y analizar archivos JSON desde una ruta relativa en sus aplicaciones Java. Aprenderá a configurar un proyecto Maven con las dependencias necesarias, crear y estructurar un archivo JSON, leerlo desde una ruta relativa y analizar su contenido, incluyendo datos anidados complejos.

Al final de este laboratorio, será competente en la gestión de datos JSON dentro de sus proyectos Java, una habilidad crítica para cualquier desarrollador que trabaje con servicios web, APIs o archivos de configuración.

Configuración del Proyecto y Creación del Archivo JSON

Antes de poder leer un archivo JSON, necesitamos configurar nuestro entorno de proyecto y crear el archivo en sí. Este laboratorio utiliza Apache Maven para gestionar las dependencias del proyecto. La configuración inicial ya ha creado una estructura de proyecto Maven estándar para usted.

Comprensión de la Estructura del Proyecto

En el explorador de archivos de WebIDE a la izquierda, verá la siguiente estructura dentro del directorio ~/project:

  • pom.xml: El archivo Project Object Model (Modelo de Objeto del Proyecto) para Maven. Define las dependencias y las configuraciones de compilación del proyecto.
  • src/main/java: El directorio para su código fuente Java.
  • src/main/resources: El directorio para archivos de recursos, como archivos de configuración o datos.

El archivo pom.xml ha sido preconfigurado para incluir la biblioteca org.json, una opción popular para trabajar con JSON en Java.

Creación del Archivo de Datos JSON

Ahora, creemos el archivo JSON que leeremos en los pasos subsiguientes.

  1. En el explorador de archivos de WebIDE, navegue hasta el directorio src/main/resources.
  2. Haga clic derecho en la carpeta resources y seleccione "New File" (Nuevo Archivo).
  3. Nombre el archivo data.json.
  4. Abra el archivo data.json recién creado y agregue el siguiente contenido:
{
  "name": "John Doe",
  "age": 28,
  "email": "john.doe@example.com",
  "isEmployed": true,
  "address": {
    "street": "123 Main St",
    "city": "Anytown"
  },
  "skills": ["Java", "SQL", "JavaScript"]
}

Este archivo JSON representa un perfil de usuario. Contiene pares clave-valor simples (como "name": "John Doe"), un objeto anidado (address) y una matriz de cadenas (skills). Guarde el archivo después de pegar el contenido.

Ahora ha configurado con éxito el proyecto y ha creado el archivo de datos JSON. En el siguiente paso, escribiremos código Java para leer y analizar este archivo.

Lectura y Análisis de un Archivo JSON Simple

Con nuestro archivo JSON en su lugar, ahora podemos escribir un programa Java para leerlo. Utilizaremos una ruta relativa, que es una práctica común para asegurar que la aplicación sea portable entre diferentes entornos.

Comprensión de las Rutas Relativas

Una ruta relativa se especifica desde el directorio de trabajo actual. Al ejecutar un proyecto Maven desde la terminal, el directorio de trabajo es típicamente la carpeta raíz del proyecto, que en nuestro caso es ~/project. Por lo tanto, la ruta relativa a nuestro archivo JSON es src/main/resources/data.json.

Creación del Lector JSON de Java

Creemos una clase Java para leer el archivo.

  1. En el explorador de archivos de WebIDE, navegue hasta src/main/java/com/labex.
  2. Haga clic derecho en la carpeta com/labex y seleccione "New File" (Nuevo Archivo).
  3. Nombre el archivo JsonReader.java.
  4. Abra el archivo y agregue el siguiente código Java:
package com.labex;

import org.json.JSONObject;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class JsonReader {
    public static void main(String[] args) {
        try {
            // Define the relative path to the JSON file
            String filePath = "src/main/resources/data.json";
            System.out.println("Reading file from: " + filePath);

            // Read the file content into a string
            String content = new String(Files.readAllBytes(Paths.get(filePath)));

            // Create a JSONObject from the string content
            JSONObject jsonObject = new JSONObject(content);

            // Access and print the values of simple keys
            String name = jsonObject.getString("name");
            int age = jsonObject.getInt("age");
            boolean isEmployed = jsonObject.getBoolean("isEmployed");

            System.out.println("\n--- Parsed JSON Data ---");
            System.out.println("Name: " + name);
            System.out.println("Age: " + age);
            System.out.println("Is Employed: " + isEmployed);

        } catch (IOException e) {
            System.out.println("Error reading file: " + e.getMessage());
        } catch (Exception e) {
            System.out.println("Error parsing JSON: " + e.getMessage());
        }
    }
}

Explicación del Código

  • package com.labex;: Declara que esta clase pertenece al paquete com.labex, siguiendo las convenciones estándar de Java.
  • String filePath = "src/main/resources/data.json";: Define la ruta relativa a nuestro archivo.
  • Files.readAllBytes(Paths.get(filePath)): Lee el contenido completo del archivo en un array de bytes, que luego se convierte a un String.
  • new JSONObject(content): Analiza la cadena que contiene los datos JSON en un JSONObject.
  • jsonObject.getString("name"): Recupera el valor de cadena asociado con la clave "name". Métodos similares como getInt() y getBoolean() se utilizan para otros tipos de datos.

Compilación y Ejecución del Programa

Ahora, compilaremos y ejecutaremos nuestro código usando Maven.

  1. Abra la terminal en WebIDE.
  2. Ejecute el siguiente comando para compilar y ejecutar su clase:
mvn compile exec:java -Dexec.mainClass="com.labex.JsonReader"

Debería ver la siguiente salida en la terminal:

Reading file from: src/main/resources/data.json

--- Parsed JSON Data ---
Name: John Doe
Age: 28
Is Employed: true

Esta salida confirma que su programa leyó con éxito el archivo data.json desde su ruta relativa y analizó sus propiedades básicas.

Manejo de Datos JSON Complejos

Los datos JSON del mundo real a menudo contienen estructuras anidadas, como objetos dentro de objetos o arreglos de valores. Nuestro archivo data.json incluye un objeto address anidado y un arreglo skills. Ampliemos nuestros conocimientos para analizar estas estructuras complejas.

Creación de un Analizador JSON Complejo

Crearemos una nueva clase para demostrar el análisis de estas partes más complejas del archivo JSON.

  1. En el explorador de archivos de WebIDE, navegue hasta src/main/java/com/labex.
  2. Cree un nuevo archivo llamado ComplexJsonParser.java.
  3. Agregue el siguiente código al archivo:
package com.labex;

import org.json.JSONArray;
import org.json.JSONObject;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class ComplexJsonParser {
    public static void main(String[] args) {
        try {
            String filePath = "src/main/resources/data.json";
            String content = new String(Files.readAllBytes(Paths.get(filePath)));
            JSONObject person = new JSONObject(content);

            System.out.println("--- Parsing Complex JSON Data ---");

            // Access the nested 'address' object
            JSONObject address = person.getJSONObject("address");
            String street = address.getString("street");
            String city = address.getString("city");

            System.out.println("\nAddress:");
            System.out.println("  Street: " + street);
            System.out.println("  City: " + city);

            // Access the 'skills' array
            JSONArray skills = person.getJSONArray("skills");
            System.out.println("\nSkills:");
            for (int i = 0; i < skills.length(); i++) {
                String skill = skills.getString(i);
                System.out.println("  - " + skill);
            }

        } catch (IOException e) {
            System.out.println("Error reading file: " + e.getMessage());
        } catch (Exception e) {
            System.out.println("Error parsing JSON: " + e.getMessage());
        }
    }
}

Explicación del Código

  • person.getJSONObject("address"): Este método recupera el objeto JSON anidado asociado con la clave "address". Luego puede llamar a métodos como getString() en este nuevo JSONObject.
  • person.getJSONArray("skills"): Este método recupera el arreglo JSON asociado con la clave "skills".
  • skills.length(): Devuelve el número de elementos en el JSONArray.
  • skills.getString(i): Recupera el elemento de cadena en un índice específico i dentro del JSONArray.

Compilación y Ejecución del Analizador

Ejecutemos esta nueva clase para ver la salida.

  1. Abra la terminal en WebIDE.
  2. Ejecute el siguiente comando:
mvn compile exec:java -Dexec.mainClass="com.labex.ComplexJsonParser"

La salida esperada es:

--- Parsing Complex JSON Data ---

Address:
  Street: 123 Main St
  City: Anytown

Skills:
  - Java
  - SQL
  - JavaScript

Esto demuestra su capacidad para navegar y extraer datos de objetos y arreglos anidados dentro de una estructura JSON, una habilidad crucial para manejar flujos de datos complejos y respuestas de API.

Creación de una Utilidad JSON Reutilizable

En el desarrollo de software, es una buena práctica escribir código reutilizable. En lugar de repetir la lógica de lectura de archivos en cada clase que la necesite, podemos crear una clase de utilidad. Este enfoque, conocido como "Don't Repeat Yourself" (DRY - No te repitas), hace que tu código sea más limpio, más fácil de mantener y menos propenso a errores.

Creación de la Clase JsonUtils

Creemos una clase de utilidad para encapsular la lógica de lectura de un archivo JSON.

  1. En WebIDE, cree un nuevo archivo llamado JsonUtils.java dentro del directorio src/main/java/com/labex.
  2. Agregue el siguiente código:
package com.labex;

import org.json.JSONObject;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class JsonUtils {

    /**
     * Reads a JSON file from a relative path and parses it into a JSONObject.
     *
     * @param filePath The relative path to the JSON file.
     * @return A JSONObject representing the file's content.
     * @throws IOException if an I/O error occurs reading from the file.
     */
    public static JSONObject readJsonObjectFromFile(String filePath) throws IOException {
        String content = new String(Files.readAllBytes(Paths.get(filePath)));
        return new JSONObject(content);
    }
}

Esta clase contiene un único método static, readJsonObjectFromFile. Un método static pertenece a la clase en sí misma en lugar de a una instancia, por lo que puedes llamarlo directamente usando el nombre de la clase (por ejemplo, JsonUtils.readJsonObjectFromFile(...)) sin crear un objeto.

Uso de la Clase de Utilidad

Ahora, creemos una clase de aplicación principal que utilice nuestra nueva utilidad.

  1. En WebIDE, cree un nuevo archivo llamado Main.java dentro del directorio src/main/java/com/labex.
  2. Agregue el siguiente código a Main.java:
package com.labex;

import org.json.JSONObject;

public class Main {
    public static void main(String[] args) {
        try {
            // Use the utility class to read the JSON file
            JSONObject data = JsonUtils.readJsonObjectFromFile("src/main/resources/data.json");

            // Now we can work with the JSONObject as before
            String name = data.getString("name");
            String city = data.getJSONObject("address").getString("city");

            System.out.println("--- Data read using JsonUtils ---");
            System.out.println("Name: " + name);
            System.out.println("City: " + city);
            System.out.println("\nSuccessfully read JSON using JsonUtils.");

        } catch (Exception e) {
            System.out.println("An error occurred: " + e.getMessage());
        }
    }
}

Esta clase Main es mucho más limpia. Delega la tarea de leer y analizar el archivo a JsonUtils, centrándose únicamente en qué hacer con el JSONObject resultante.

Ejecución de la Aplicación Principal

Finalmente, ejecutemos nuestra clase Main.

  1. Abra la terminal en WebIDE.
  2. Ejecute el siguiente comando:
mvn compile exec:java -Dexec.mainClass="com.labex.Main"

Verá la siguiente salida:

--- Data read using JsonUtils ---
Name: John Doe
City: Anytown

Successfully read JSON using JsonUtils.

Al crear una clase de utilidad, ha hecho que su código sea más modular y reutilizable, lo cual es un principio clave de la ingeniería de software efectiva.

Resumen

En este laboratorio, ha adquirido habilidades prácticas para manejar archivos JSON en Java. Ha progresado desde la configuración básica hasta técnicas de análisis avanzadas, culminando en la creación de código reutilizable.

Aquí tiene un resumen de lo que ha aprendido:

  • Configuración del Proyecto: Aprendió a estructurar un proyecto Maven e incluir bibliotecas externas como org.json para trabajar con JSON.
  • Creación de Archivos JSON: Creó un archivo JSON bien formado que contiene varios tipos de datos, incluyendo cadenas (strings), números, booleanos, objetos anidados y arreglos (arrays).
  • Lectura desde una Ruta Relativa: Leyó con éxito un archivo utilizando una ruta relativa, una técnica que hace que las aplicaciones sean más portátiles.
  • Análisis de JSON: Utilizó la biblioteca org.json para analizar cadenas JSON en objetos JSONObject y JSONArray, lo que le permite acceder a los datos mediante programación.
  • Manejo de Estructuras Complejas: Aprendió a navegar por objetos JSON anidados e iterar sobre arreglos JSON para extraer datos complejos.
  • Reutilización de Código: Aplicó el principio DRY (Don't Repeat Yourself - No te repitas) creando una clase JsonUtils para encapsular la lógica de lectura de archivos, lo que conduce a un código más limpio y fácil de mantener.

La capacidad de leer, analizar y manipular datos JSON es esencial para cualquier desarrollador de Java involucrado en servicios web, integración de API o configuración de aplicaciones. La base que ha construido en este laboratorio será invaluable a medida que aborde desafíos de desarrollo más complejos.