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

Quiero leer este archivo JSON con Java usando la biblioteca json simple.

Mi archivo JSON 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 de 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 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 subproceso “principal” java.lang.ClassCastException: org.json.simple.JSONArray no se puede convertir en org.json.simple.JSONObject en javaapplication1.JavaApplication1.main (JavaApplication1.java:24)

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

Gracias

El archivo completo es una matriz y hay objetos y otras matrices (por ejemplo, automóviles) 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 . A continuación, puede obtener JSONObject s 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+""); } } 

Para referencia, vea “Ejemplo 1” en la página de ejemplo de deencoding json-simple .

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

 ObjectMapper mapper = new ObjectMapper(); InputStream is = Test.class.getResourceAsStream("/test.json"); testObj = mapper.readValue(is, Test.class); 

Puedes usar Gson para esto.
GSON es una biblioteca de Java que se puede utilizar para convertir objetos de Java en su representación JSON . También se puede usar para convertir una cadena JSON a un objeto Java equivalente.

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

Leyendo de JsonFile

 public static ArrayList readFromJsonFile(String fileName){ ArrayList result = new ArrayList(); 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; } 
 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(); } } } 

Usa la biblioteca google-simple.

  com.googlecode.json-simple json-simple 1.1.1  

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 como {"id":"1","name":"ankur"} y JSONArray para una matriz de JSON como [{"id":"1","name":"ankur"},{"id":"2","name":"mahajan"}] .

Añadir enlace de datos de Jackson:

  com.fasterxml.jackson.core jackson-databind 2.9.0.pr2  

Crear clase DTO con campos relacionados y leer el archivo JSON:

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

Podría ser de ayuda para otra persona que enfrenta el mismo problema. Puede cargar el archivo como una cadena y luego puede convertir la cadena en 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); 

Espero que este ejemplo ayude también

He hecho encoding java de una manera similar para el siguiente ejemplo json array de la siguiente manera:

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”, “ROL”: “ANALISTA DEL PROYECTO”}

{“EMPNO”: 275174, “EMP_NAME”: “Mohamed Mushi”, “DOB”: “10-04-1992”, “DOJ”: “12-08-2013”, “ROL”: “ANALISTA DEL PROYECTO”}]

 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(); } } } 
 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 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(); } } } 

Muestra Json

 { "per_page": 3, "total": 12, "data": [{ "last_name": "Bluth", "id": 1, "avatar": "http://sofes.miximages.com/java/128.jpg", "first_name": "George" }, { "last_name": "Weaver", "id": 2, //"avatar": "http://sofes.miximages.com/java/128.jpg", "first_name": "Janet" }, { "last_name": "Wong", "id": 3, //"avatar": "http://sofes.miximages.com/java/128.jpg", "first_name": "Emma" } ], "page": 1, "total_pages": 4 } 

La instrucción First If convertirá los datos individuales del cuerpo Second if statement 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(); } } 

Puede usar readAllBytes.

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