从文件Json获取数据

时间:2017-03-22 20:39:27

标签: java json

我在json提交数据时遇到问题。总共有很多类似的问题,但没有一个对我有帮助.Me 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     在zadanie。

2 个答案:

答案 0 :(得分:0)

JSON对象以花括号开头和结尾,即......

{“name”:“joe”,“age”:“29”}

JSON数组以方括号开头和结尾,即......

[“bill”,29]

您发布的JSON是一个JSON对象,因为它以花括号开头和结尾,但它包含JSON数组。因此,在迭代数据时,您需要在适当的位置强制转换数组。

首先,将您的JSONArray声明更改为

JSONObject a =(JSONObject)parser.parse(new FileReader(“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();
}

答案 1 :(得分:0)

我可以给你一个主意吗?假设您正在使用Jackson(我非常同意)为什么不创建一个与您的json匹配的Java类,并使用ObjectMapper来映射它以便您可以更轻松地使用该类?

与你的json对象匹配的java类是这样的(注释只是lombok库,以避免样板getter和setter代码,但它不是强制性的)

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class CustomClass {
    List<String> miasta;
    List<Drogi> drogi;
    Integer timeout;
    Integer max_czas_przejazdu;
}

使用该类,您只需要使用ObjectMapper。这里显示的测试与您发布的JSON相匹配

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