Eu quero ler este JSON
arquivo com java usando a biblioteca simples json.
Meu JSON
arquivo se parece com este:
[
{
"name":"John",
"city":"Berlin",
"cars":[
"audi",
"bmw"
],
"job":"Teacher"
},
{
"name":"Mark",
"city":"Oslo",
"cars":[
"VW",
"Toyata"
],
"job":"Doctor"
}
]
Este é o código java que escrevi para ler este arquivo:
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();
}
}
}
Mas recebo a seguinte exceção:
Exceção no thread "main" java.lang.ClassCastException: org.json.simple.JSONArray não pode ser convertido em org.json.simple.JSONObject em javaapplication1.JavaApplication1.main (JavaApplication1.java:24)
Alguém pode me dizer o que estou fazendo de errado? Todo o arquivo é um array e há objetos e outro array (carros) em todo o array do arquivo. Mas eu não sei como posso analisar todo o array em um array java. Espero que alguém possa me ajudar com uma linha de código que está faltando no meu código.
obrigado
fonte
a.get(0)
) porque era a correspondência mais próxima do seu código original. A documentação do json-simple diz queJSONArray
éjava.util.List
, portanto, você pode iterar sobre os elementos como faria em uma lista normal. Isso é o suficiente para continuar?parser
de qual biblioteca (importação) é?Você pode usar a biblioteca jackson e simplesmente usar essas 3 linhas para converter seu arquivo json para objeto Java.
ObjectMapper mapper = new ObjectMapper(); InputStream is = Test.class.getResourceAsStream("/test.json"); testObj = mapper.readValue(is, Test.class);
fonte
import com.fasterxml.jackson.databind.ObjectMapper;
Adicionar databind de Jackson:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0.pr2</version> </dependency>
Crie uma classe DTO com campos relacionados e leia o arquivo JSON:
ObjectMapper objectMapper = new ObjectMapper(); ExampleClass example = objectMapper.readValue(new File("example.json"), ExampleClass.class);
fonte
Lendo do 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; }
fonte
Você pode usar Gson para isso.
GSON
é uma biblioteca Java que pode ser usada para converter objetos Java em suaJSON
representação. Ele também pode ser usado para converter umaJSON
string em um objeto Java equivalente.Dê uma olhada neste Converting JSON to Java
fonte
Use a biblioteca google-simple.
<dependency> <groupId>com.googlecode.json-simple</groupId> <artifactId>json-simple</artifactId> <version>1.1.1</version> </dependency>
Encontre o código de exemplo abaixo:
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 simples
{"id":"1","name":"ankur"}
e JSONArray para array de JSON[{"id":"1","name":"ankur"},{"id":"2","name":"mahajan"}]
.fonte
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(); } } }
fonte
Pode ser útil para alguém que esteja enfrentando o mesmo problema. Você pode carregar o arquivo como string e então converter a string para jsonobject para acessar os valores.
import java.util.Scanner; import org.json.JSONObject; String myJson = new Scanner(new File(filename)).useDelimiter("\\Z").next(); JSONObject myJsonobject = new JSONObject(myJson);
fonte
Espero que este exemplo ajude também
Fiz a codificação java de uma maneira semelhante para o exemplo de array json abaixo da seguinte maneira:
a seguir está o formato de dados json: armazenado 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", "DOB": "10-04-1992", "DOJ": "12-08-2013", "PAPEL": "ANALISTA DE PROJETO"}]
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(); } } }
fonte
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(); } } }
fonte
Sample 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 }
A primeira instrução If converterá os dados únicos do corpo e a segunda instrução if diferenciará o 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(); } }
fonte
Solução usando a biblioteca Jackson. Resolvido este problema verificando o json em JSONLint.com e usando Jackson. Abaixo está o código para o mesmo.
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]
fonte
seu arquivo json se parece com este
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(); } } }
a saída é
tirou daqui
fonte
Esse problema ocorre quando você está importando a organização. Biblioteca json para a classe JSONObject. Em vez disso, você precisa importar a biblioteca org.json.simple.
fonte
Você pode usar readAllBytes.
return String(Files.readAllBytes(Paths.get(filePath)),StandardCharsets.UTF_8);
fonte