Quiero leer este JSON
archivo con java usando la biblioteca json simple.
Mi JSON
archivo 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
fuente
a.get(0)
) porque era la coincidencia más cercana a su código original. La documentación json-simple dice aJSONArray
isjava.util.List
, por lo que puede iterar sobre los elementos como lo haría con una lista normal. ¿Es eso suficiente para continuar?parser
¿de qué biblioteca (importación) es?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);
fuente
import com.fasterxml.jackson.databind.ObjectMapper;
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);
fuente
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; }
fuente
Puedes usar Gson para esto.
GSON
es una biblioteca Java que se puede utilizar para convertir objetos Java en suJSON
representació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
fuente
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"}]
.fuente
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(); } } }
fuente
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);
fuente
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(); } } }
fuente
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(); } } }
fuente
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(); } }
fuente
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]
fuente
su archivo json se ve así
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
lo tomé de aquí
fuente
Puede utilizar readAllBytes.
return String(Files.readAllBytes(Paths.get(filePath)),StandardCharsets.UTF_8);
fuente