【问题标题】:Obtaining data from a file Json从文件 Json 中获取数据
【发布时间】:2017-03-24 08:09:12
【问题描述】:

我在 json 文件中提取数据时遇到问题。总共有很多类似的问题,但没有一个对我有帮助。我 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);
     }
 }

还有错误:

线程“主”java.lang.ClassCastException 中的异常: org.json.simple.JSONObject 不能转换为 org.json.simple.JSONArray 在zadanie。

【问题讨论】:

  • 此错误可帮助您缩小问题范围 - org.json.simple.JSONObject 无法转换为 org.json.simple.JSONArray 您正在尝试将 JSONObject 转换为 JSONArray。你的变量a不应该是JSONObject吗?
  • 您将 JSON 作为数组加载,但实际上并非如此。这是一个对象。

标签: java json


【解决方案1】:

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

{“姓名”:“乔”,“年龄”:“29”}

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

[“法案”,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();
}

【讨论】:

  • 我有一个问题。如何将 miasta 保存在 String nad czas_przejazdu in int 中?
  • 在我上面发布的代码中,“drogi”数组中的每个 json 对象都已放入 List。每个对象都有一个“mista”和一个“czas_przejazdu”。因此,要将 mista 作为任何一个 drogi 对象的字符串,只需获取您想要的索引并执行... String miasta = drogi_objects.get(0).get("miasta"); int czas = Integer.parseInt(drogi_objects.get(0).get("czas_przejazdu"));只需将“0”替换为您想要的索引即可。
【解决方案2】:

我可以给你一个想法吗?考虑到您使用的是 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));
    }
}

【讨论】:

    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 2016-03-01
    • 2021-11-10
    相关资源
    最近更新 更多