Cómo leer un archivo json en java con una biblioteca JSON simple

95

Quiero leer este JSONarchivo con java usando la biblioteca json simple.

Mi JSONarchivo se ve así:

[  
    {  
        "name":"John",
        "city":"Berlin",
        "cars":[  
            "audi",
            "bmw"
        ],
        "job":"Teacher"
    },
    {  
        "name":"Mark",
        "city":"Oslo",
        "cars":[  
            "VW",
            "Toyata"
        ],
        "job":"Doctor"
    }
]

Este es el código java que escribí para leer este archivo:

package javaapplication1;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JavaApplication1 {
    public static void main(String[] args) {

        JSONParser parser = new JSONParser();

        try {     
            Object obj = parser.parse(new FileReader("c:\\file.json"));

            JSONObject jsonObject =  (JSONObject) obj;

            String name = (String) jsonObject.get("name");
            System.out.println(name);

            String city = (String) jsonObject.get("city");
            System.out.println(city);

            String job = (String) jsonObject.get("job");
            System.out.println(job);

            // loop array
            JSONArray cars = (JSONArray) jsonObject.get("cars");
            Iterator<String> iterator = cars.iterator();
            while (iterator.hasNext()) {
             System.out.println(iterator.next());
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

Pero obtengo la siguiente excepción:

Excepción en el hilo "principal" java.lang.ClassCastException: org.json.simple.JSONArray no se puede convertir a org.json.simple.JSONObject en javaapplication1.JavaApplication1.main (JavaApplication1.java:24)

¿Alguien puede decirme qué estoy haciendo mal? Todo el archivo es una matriz y hay objetos y otra matriz (coches) en toda la matriz del archivo. Pero no sé cómo puedo analizar toda la matriz en una matriz java. Espero que alguien pueda ayudarme con una línea de código que me falta en mi código.

Gracias

billz
fuente

Respuestas:

85

Todo el archivo es una matriz y hay objetos y otras matrices (por ejemplo, coches) en toda la matriz del archivo.

Como dices, la capa más externa de tu blob JSON es una matriz. Por lo tanto, su analizador devolverá un JSONArray. Luego puede obtener JSONObjects de la matriz ...

  JSONArray a = (JSONArray) parser.parse(new FileReader("c:\\exer4-courses.json"));

  for (Object o : a)
  {
    JSONObject person = (JSONObject) o;

    String name = (String) person.get("name");
    System.out.println(name);

    String city = (String) person.get("city");
    System.out.println(city);

    String job = (String) person.get("job");
    System.out.println(job);

    JSONArray cars = (JSONArray) person.get("cars");

    for (Object c : cars)
    {
      System.out.println(c+"");
    }
  }

Como referencia, consulte el "Ejemplo 1" en la página de ejemplo de decodificación json-simple .

Greg Kopff
fuente
Gracias. Lee el primer objeto de curso, instructor, matriz de estudiantes y objeto de título. ¿Cómo puedo leer los siguientes también?
billz
Bueno, desea procesar todos los elementos de la matriz en un bucle. Mi código solo le da el primer elemento ( a.get(0)) porque era la coincidencia más cercana a su código original. La documentación json-simple dice a JSONArrayis java.util.List, por lo que puede iterar sobre los elementos como lo haría con una lista normal. ¿Es eso suficiente para continuar?
Greg Kopff
Lo intenté pero no funcionó. ¿Puede darme un ejemplo de código
Billz
3
¡Esto funciona muy bien! Tenga en cuenta: utilice la importación como está en este ejemplo (es decir, con 'simple'), de lo contrario no permitirá 'para cada uno'. Incorrecto: import org.json.JSONArray; import org.json.JSONObject; Correcto: import org.json.simple.JSONArray; import org.json.simple.JSONObject;
Krishna Sapkota
1
parser¿de qué biblioteca (importación) es?
user25
46

Puede usar la biblioteca jackson y simplemente usar estas 3 líneas para convertir su archivo json a un objeto Java.

ObjectMapper mapper = new ObjectMapper();
InputStream is = Test.class.getResourceAsStream("/test.json");
testObj = mapper.readValue(is, Test.class);
Mady
fuente
1
¿Puedo conocer los enlaces del jar de ObjectMapper para descargar?
Rence Abishek
1
@RenceAbishek lo importa conimport com.fasterxml.jackson.databind.ObjectMapper;
Ron Kalian
11

Agregar enlace de datos Jackson:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.0.pr2</version>
</dependency>

Cree la clase DTO con campos relacionados y lea el archivo JSON:

ObjectMapper objectMapper = new ObjectMapper();
ExampleClass example = objectMapper.readValue(new File("example.json"), ExampleClass.class);
Tal como
fuente
10

Leyendo desde JsonFile

public static ArrayList<Employee> readFromJsonFile(String fileName){
        ArrayList<Employee> result = new ArrayList<Employee>();

        try{
            String text = new String(Files.readAllBytes(Paths.get(fileName)), StandardCharsets.UTF_8);

            JSONObject obj = new JSONObject(text);
            JSONArray arr = obj.getJSONArray("employees");

            for(int i = 0; i < arr.length(); i++){
                String name = arr.getJSONObject(i).getString("name");
                short salary = Short.parseShort(arr.getJSONObject(i).getString("salary"));
                String position = arr.getJSONObject(i).getString("position");
                byte years_in_company = Byte.parseByte(arr.getJSONObject(i).getString("years_in_company")); 
                if (position.compareToIgnoreCase("manager") == 0){
                    result.add(new Manager(name, salary, position, years_in_company));
                }
                else{
                    result.add(new OrdinaryEmployee(name, salary, position, years_in_company));
                }
            }           
        }
        catch(Exception ex){
            System.out.println(ex.toString());
        }
        return result;
    }
Osito de peluche
fuente
7

Puedes usar Gson para esto.
GSONes una biblioteca Java que se puede utilizar para convertir objetos Java en su JSONrepresentación. También se puede utilizar para convertir unJSON cadena en un objeto Java equivalente.

Eche un vistazo a esta conversión de JSON a Java

Sumit Singh
fuente
17
¿Crees que debería cambiar de biblioteca porque tuvo un inconveniente? No es exactamente la ruta más directa para que su programa funcione ... ;-)
Greg Kopff
5

Utilice la biblioteca simple de Google.

<dependency>
    <groupId>com.googlecode.json-simple</groupId>
    <artifactId>json-simple</artifactId>
    <version>1.1.1</version>
</dependency>

Encuentre el código de muestra a continuación:

public static void main(String[] args) {
    try {
        JSONParser parser = new JSONParser();
        //Use JSONObject for simple JSON and JSONArray for array of JSON.
        JSONObject data = (JSONObject) parser.parse(
              new FileReader("/resources/config.json"));//path to the JSON file.

        String json = data.toJSONString();
    } catch (IOException | ParseException e) {
        e.printStackTrace();
    }
}

Use JSONObject para JSON simple {"id":"1","name":"ankur"}y JSONArray para una matriz de JSON [{"id":"1","name":"ankur"},{"id":"2","name":"mahajan"}].

Ankur Mahajan
fuente
4
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class Delete_01 {
    public static void main(String[] args) throws FileNotFoundException,
            IOException, ParseException {

        JSONParser parser = new JSONParser();
        JSONArray jsonArray = (JSONArray) parser.parse(new FileReader(
                "delete_01.json"));

        for (Object o : jsonArray) {
            JSONObject person = (JSONObject) o;

            String strName = (String) person.get("name");
            System.out.println("Name::::" + strName);

            String strCity = (String) person.get("city");
            System.out.println("City::::" + strCity);

            JSONArray arrays = (JSONArray) person.get("cars");
            for (Object object : arrays) {
                System.out.println("cars::::" + object);
            }
            String strJob = (String) person.get("job");
            System.out.println("Job::::" + strJob);
            System.out.println();

        }

    }
}
Delvin
fuente
4

Podría ser de ayuda para otra persona que enfrenta el mismo problema. Puede cargar el archivo como cadena y luego puede convertir la cadena a jsonobject para acceder a los valores.

import java.util.Scanner;
import org.json.JSONObject;
String myJson = new Scanner(new File(filename)).useDelimiter("\\Z").next();
JSONObject myJsonobject = new JSONObject(myJson);
Srijan Sharma
fuente
1

Espero que este ejemplo también ayude

He hecho la codificación de Java de una manera similar para el siguiente ejemplo de matriz json de la siguiente manera:

el siguiente es el formato de datos json: almacenado como "EMPJSONDATA.json"

[{"EMPNO": 275172, "EMP_NAME": "Rehan", "DOB": "29-02-1992", "DOJ": "10-06-2013", "ROLE": "JAVA DEVELOPER"},

{"EMPNO": 275173, "EMP_NAME": "GK", "DOB": "10-02-1992", "DOJ": "11-07-2013", "ROLE": "WINDOWS ADMINISTRATOR"},

{"EMPNO": 275174, "EMP_NAME": "Abiram", "DOB": "10-04-1992", "DOJ": "12-08-2013", "ROLE": "PROJECT ANALYST"}

{"EMPNO": 275174, "EMP_NAME": "Mohamed Mushi", "Fecha de nacimiento": "10-04-1992", "DOJ": "12-08-2013", "ROLE": "PROJECT ANALYST"}]

public class Jsonminiproject {

public static void main(String[] args) {

      JSONParser parser = new JSONParser();

    try {
        JSONArray a = (JSONArray) parser.parse(new FileReader("F:/JSON DATA/EMPJSONDATA.json"));
        for (Object o : a)
        {
            JSONObject employee = (JSONObject) o;

            Long no = (Long) employee.get("EMPNO");
            System.out.println("Employee Number : " + no);

            String st = (String) employee.get("EMP_NAME");
            System.out.println("Employee Name : " + st);

            String dob = (String) employee.get("DOB");
            System.out.println("Employee DOB : " + dob);

            String doj = (String) employee.get("DOJ");
            System.out.println("Employee DOJ : " + doj);

            String role = (String) employee.get("ROLE");
            System.out.println("Employee Role : " + role);

            System.out.println("\n");

        }


    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }




}

}
rehan hanar
fuente
Token inesperado LEFT BRACE ({) en la posición 156.
Thanga
1
package com.json;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class ReadJSONFile {

    public static void main(String[] args) {

        JSONParser parser = new JSONParser();

        try {
            Object obj = parser.parse(new FileReader("C:/My Workspace/JSON Test/file.json"));

            JSONArray array = (JSONArray) obj;
            JSONObject jsonObject = (JSONObject) array.get(0);

            String name = (String) jsonObject.get("name");
            System.out.println(name);

            String city = (String) jsonObject.get("city");
            System.out.println(city);

            String job = (String) jsonObject.get("job");
            System.out.println(job);

            // loop array
            JSONArray cars = (JSONArray) jsonObject.get("cars");
            Iterator<String> iterator = cars.iterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

}
P RAJESH
fuente
Su archivo JSON tiene una matriz de objetos, por lo que atraviesa la matriz
P RAJESH
2
Si bien este código puede responder a la pregunta, proporcionar un contexto adicional sobre cómo y / o por qué resuelve el problema mejoraría el valor de la respuesta a largo plazo.
Timothy Truckle
0

Muestra Json

{
    "per_page": 3,
    "total": 12,
    "data": [{
            "last_name": "Bluth",
            "id": 1,
            "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/calebogden/128.jpg",
            "first_name": "George"
        },
        {
            "last_name": "Weaver",
            "id": 2,
            //"avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg",
            "first_name": "Janet"
        },
        {
            "last_name": "Wong",
            "id": 3,
            //"avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/olegpogodaev/128.jpg",
            "first_name": "Emma"
        }
    ],
    "page": 1,
    "total_pages": 4
}

La primera instrucción If convertirá los datos individuales del cuerpo La segunda instrucción if diferenciará el objeto JsonArray

public static String getvalueJpath(JSONObject responseJson, String Jpath ) {
        Object obj = responseJson;
        for(String s : Jpath.split("/"))
            if (s.isEmpty())
                if(!(s.contains("[") || s.contains("]")))
                    obj = ((JSONObject) obj).get(s);
                else
                    if(s.contains("[") || s.contains("]"))
                        obj = ((JSONArray)((JSONObject)obj).get(s.split("\\[")[0])).get(Integer.parseInt(s.split("//[")[1].replaceAll("]", "")));

        return obj.toString();
    }
}
lokesh sharma
fuente
0

Solución usando la biblioteca Jackson. Se solucionó este problema verificando el json en JSONLint.com y luego usando Jackson. A continuación se muestra el código para el mismo.

 Main Class:-

String jsonStr = "[{\r\n" + "       \"name\": \"John\",\r\n" + "        \"city\": \"Berlin\",\r\n"
                + "         \"cars\": [\r\n" + "            \"FIAT\",\r\n" + "          \"Toyata\"\r\n"
                + "     ],\r\n" + "     \"job\": \"Teacher\"\r\n" + "   },\r\n" + " {\r\n"
                + "     \"name\": \"Mark\",\r\n" + "        \"city\": \"Oslo\",\r\n" + "        \"cars\": [\r\n"
                + "         \"VW\",\r\n" + "            \"Toyata\"\r\n" + "     ],\r\n"
                + "     \"job\": \"Doctor\"\r\n" + "    }\r\n" + "]";

        ObjectMapper mapper = new ObjectMapper();

        MyPojo jsonObj[] = mapper.readValue(jsonStr, MyPojo[].class);

        for (MyPojo itr : jsonObj) {

            System.out.println("Val of getName is: " + itr.getName());
            System.out.println("Val of getCity is: " + itr.getCity());
            System.out.println("Val of getJob is: " + itr.getJob());
            System.out.println("Val of getCars is: " + itr.getCars() + "\n");

        }

POJO:

public class MyPojo {

private List<String> cars = new ArrayList<String>();

private String name;

private String job;

private String city;

public List<String> getCars() {
    return cars;
}

public void setCars(List<String> cars) {
    this.cars = cars;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getJob() {
    return job;
}

public void setJob(String job) {
    this.job = job;
}

public String getCity() {
    return city;
}

public void setCity(String city) {
    this.city = city;
} }

  RESULT:-
         Val of getName is: John
         Val of getCity is: Berlin
         Val of getJob is: Teacher
         Val of getCars is: [FIAT, Toyata]

          Val of getName is: Mark
          Val of getCity is: Oslo
          Val of getJob is: Doctor
          Val of getCars is: [VW, Toyata]
Atul Sharma
fuente
0

su archivo json se ve así

ingrese la descripción de la imagen aquí

import java.io.*;
import java.util.*;
import org.json.simple.*;
import org.json.simple.parser.*;
public class JSONReadFromTheFileTest {
   public static void main(String[] args) {
      JSONParser parser = new JSONParser();
      try {
         Object obj = parser.parse(new FileReader("/Users/User/Desktop/course.json"));
         JSONObject jsonObject = (JSONObject)obj;
         String name = (String)jsonObject.get("Name");
         String course = (String)jsonObject.get("Course");
         JSONArray subjects = (JSONArray)jsonObject.get("Subjects");
         System.out.println("Name: " + name);
         System.out.println("Course: " + course);
         System.out.println("Subjects:");
         Iterator iterator = subjects.iterator();
         while (iterator.hasNext()) {
            System.out.println(iterator.next());
         }
      } catch(Exception e) {
         e.printStackTrace();
      }
   }
}

la salida es

Name: Raja
Course: MCA
Subjects:
subject1: MIS
subject2: DBMS
subject3: UML

lo tomé de aquí

Sportac
fuente
-2

Puede utilizar readAllBytes.

return String(Files.readAllBytes(Paths.get(filePath)),StandardCharsets.UTF_8);

Rajat Mahajan
fuente
1
La pregunta original se refiere a la lectura en un objeto JSON, no en una cadena.
Aaron