Java 从Json文件获取数据

Java 从Json文件获取数据,java,json,Java,Json,我在提取json文件中的数据时遇到了一个问题。总的来说,有很多类似的问题,但没有一个对我有帮助 { "miasta" : ["A", "B", "C", "D", "E"], "drogi" : [ { "miasta" : ["A", "B"], "czas_przejazdu" : 2 }, { "miasta" : ["A", "C"],

我在提取json文件中的数据时遇到了一个问题。总的来说,有很多类似的问题,但没有一个对我有帮助

{
    "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));
    }
}