Java 从Json文件获取数据
我在提取json文件中的数据时遇到了一个问题。总的来说,有很多类似的问题,但没有一个对我有帮助Java 从Json文件获取数据,java,json,Java,Json,我在提取json文件中的数据时遇到了一个问题。总的来说,有很多类似的问题,但没有一个对我有帮助 { "miasta" : ["A", "B", "C", "D", "E"], "drogi" : [ { "miasta" : ["A", "B"], "czas_przejazdu" : 2 }, { "miasta" : ["A", "C"],
{
"miasta" : ["A", "B", "C", "D", "E"],
"drogi" : [
{
"miasta" : ["A", "B"],
"czas_przejazdu" : 2
},
{
"miasta" : ["A", "C"],
"czas_przejazdu" : 3
},
{
"miasta" : ["A", "D"],
"czas_przejazdu" : 4
},
{
"miasta" : ["A", "E"],
"czas_przejazdu" : 1
}
],
"timeout" : 5,
"max_czas_przejazdu" : 10
}
我尝试了不同的方法,但没有获得所有数据。这是我当前的代码:
public static void main(String[] args) throws FileNotFoundException, ParseException, IOException {
JSONParser parser = new JSONParser();
JSONArray a = (JSONArray) parser.parse(new FileReader("C:\\Users\\Laptop\\Desktop\\in.json"));
for (Object o : a)
{
JSONObject person = (JSONObject) o;
String name = (String) person.get("miasta");
System.out.println(name);
JSONArray drogi = (JSONArray) person.get("drogi");
for (Object c : drogi)
{
System.out.println(c+"");
}
String job = (String) person.get("czas_przejazdu");
System.out.println(job);
}
}
错误是:
线程“main”java.lang.ClassCastException中的异常:
无法将org.json.simple.JSONObject强制转换为org.json.simple.JSONArray
在扎达尼
JSON对象以大括号开始和结束,即 {“姓名”:“乔”,“年龄”:“29”} JSON数组以方括号开始和结束,即 [“条例草案”,29] 您发布的JSON是一个JSON对象,因为它以大括号开头和结尾,但它包含JSON数组。因此,在对数据进行迭代时,需要在适当的位置强制转换数组 首先,将JSONArray声明更改为 JSONObject a=(JSONObject)parser.parse(新文件读取器(“C:\Users\Laptop\Desktop\in.json”) 更新 这应该对你有用
JSONParser parser = new JSONParser();
try (BufferedReader br = new BufferedReader(new FileReader(System.getProperty("user.home") + File.separator + "in.json"))) {
StringBuilder jsonBuilder = new StringBuilder();
String line;
while ( (line = br.readLine()) != null) {
jsonBuilder.append(line);
}
JSONObject fullJsonObject = (JSONObject) parser.parse(jsonBuilder.toString());
//System.out.println(fullJsonObject);
JSONArray mista = (JSONArray) fullJsonObject.get("miasta");
//System.out.println(mista);
JSONArray drogi = (JSONArray) fullJsonObject.get("drogi");
//System.out.println(drogi);
List<JSONObject> drogi_objects = new ArrayList<>();
Iterator<JSONObject> itr = drogi.iterator();
while (itr.hasNext()) {
drogi_objects.add( itr.next() );
}
//System.out.println(drogi_objects);
int iteration = 1;
for(JSONObject element : drogi_objects) {
System.out.println("\n");
System.out.println("Iteration:\t " + iteration);
System.out.println("Miasta\t: " + element.get("miasta"));
System.out.println("czas_przejazdu:\t" + element.get("czas_przejazdu"));
++iteration;
}
} catch (Exception ex) {
ex.printStackTrace();
}
JSONParser=newjsonparser();
try(BufferedReader br=new BufferedReader(new FileReader(System.getProperty(“user.home”)+File.separator+“in.json”)){
StringBuilder jsonBuilder=新的StringBuilder();
弦线;
而((line=br.readLine())!=null){
jsonBuilder.append(行);
}
JSONObject fullJsonObject=(JSONObject)parser.parse(jsonBuilder.toString());
//System.out.println(fullJsonObject);
JSONArray mista=(JSONArray)fullJsonObject.get(“miasta”);
//系统输出打印LN(mista);
JSONArray drogi=(JSONArray)fullJsonObject.get(“drogi”);
//系统输出打印LN(drogi);
列出drogi_对象=新建ArrayList();
迭代器itr=drogi.Iterator();
while(itr.hasNext()){
drogi_objects.add(itr.next());
}
//System.out.println(drogi_对象);
int迭代=1;
for(JSONObject元素:drogi_对象){
System.out.println(“\n”);
System.out.println(“迭代:\t”+迭代);
System.out.println(“Miasta\t:+element.get”(“Miasta”);
System.out.println(“czas_przejazdu:\t”+element.get(“czas_przejazdu”);
++迭代;
}
}捕获(例外情况除外){
例如printStackTrace();
}
我能给你一个主意吗?既然您使用的是Jackson(我非常同意),为什么不创建一个与json匹配的Java类,并使用ObjectMapper对其进行映射,以便更轻松地使用该类呢
与json对象匹配的java类如下所示(注释只是lombok库,以避免样板文件的getter和setter代码,但不是必需的)
此错误有助于缩小问题范围-org.json.simple.JSONObject无法强制转换为org.json.simple.JSONArray您正在尝试将
JSONObject
强制转换为JSONArray
。您的变量a
不应该是JSONObject
?您正在将JSON作为数组加载,而它不是。这是一个对象。我有一个问题。如何将miasta保存为字符串nad czas_przejazdu in int?在我上面发布的代码中,“drogi”数组中的每个json对象都被放入一个列表中。每个对象都有一个“mista”和一个“czas_przejazdu”。因此,要将mista作为任何一个drogi对象的字符串,只需获取所需的索引并执行。。。字符串miasta=drogi_objects.get(0.get)(“miasta”);intczas=Integer.parseInt(drogi_objects.get(0.get)(“czas_przejazdu”);只需将“0”替换为所需的索引即可。
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class CustomClass {
List<String> miasta;
List<Drogi> drogi;
Integer timeout;
Integer max_czas_przejazdu;
}
public class UseOfObjectMapperTest{
@Test
public void testSerializer() throws Exception{
//Read example
ObjectMapper objectMapper = new ObjectMapper();
CustomClass customClass = objectMapper.readValue(new File("src/test/resources/customclass.json"),CustomClass.class);
System.out.println(objectMapper.writeValueAsString(customClass));
//Write Example
CustomClass cc = new CustomClass(
Arrays.asList("A","B"),
Arrays.asList(new Drogi(Arrays.asList("C1","D1"), 10),
new Drogi(Arrays.asList("C2","D2"),10)),
15,20);
System.out.println(objectMapper.writeValueAsString(cc));
}
}