为什么无法读取 .json?

Why can't read a .json?

我想使用库 json-simple 阅读 .json,我的 json 文件是:

{
    "Subjects": {
    "subject1": "MIS",
    "subject2": "DBMS",
    "subject3": "UML"
    }
}

我的代码是:

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;
            JSONArray subjects = (JSONArray)jsonObject.get("Subjects");
            Iterator iterator = subjects.iterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }

        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

我想进入控制台:

subject1: MIS
subject2: DBMS
subject3: UML

但除此之外,我只收到下一个错误:

java.lang.ClassCastException: org.json.simple.JSONObject cannot be cast to org.json.simple.JSONArray
    at project.Main(Main.java:11)

但是我在网上搜索了一下,发现如果我把.json的sintaxys改成下面这样:

{
    "Subjects": [
    "subject1: MIS",
    "subject2: DBMS",
    "subject3: UML"
    ]
}

我在控制台中得到了我想要的:

subject1: MIS
subject2: DBMS
subject3: UML

你可能认为我的问题已经解决了,但还没有,因为我想用第一种方式读取json文件。 我希望有一个人可以帮助我。提前致谢。

方括号表示一个数组,您已将 getter 转换为该数组。

显示的第二个 json 对于您编写的代码更正确,但是,数组不能容纳 key-value 对,所以这就是为什么您使第二个 JSON 具有字符串数组

要解析第一个文件,您需要从

开始
JSONObject subjects = (JSONObject)jsonObject.get("Subjects")

如果您可以完全控制该文件,我建议只存储 ["MIS", "DBMS", "UML"] 然后编写一个简单的循环

for (int i = 0; i < jsonArray.length; i++) {
  System.out.printf("subject%d: %s%n", i+1, jsonArray.get(i));
}

第一个示例显示了包含具有多个属性(subject1、subject2 等)的单个对象的 Subjects 键。
将这些属性视为 class 的成员变量。 为了让您更好地理解 class 是否为 Person,这些变量可以是 name 和 surname。

您尝试在代码中实现的是从您提供的 JSON 中提取一个 JSON 数组。 回到 Person 的示例,数组可能是 - 对这个愚蠢的示例感到抱歉 - 一个包含 phone 数字的数组。 所以你期望的是 class 的成员属性之一是一个数组。

这在第一个示例中是不可能的,因为第一个示例不包含 json 数组。

此行提取整个 json 对象:
JSONObject jsonObject = (JSONObject)obj;

这个尝试取出一个数组,但第一个例子中没有数组:
JSONArray subjects = (JSONArray)jsonObject.get("Subjects");

为了使您的代码与您的 json 一起工作,您不应使用 JSONArray 作为“主题”,而应使用 JSONObject。原因是[]表示json中数组元素的开始和结束,由JSONArray表示。如果您有 {} 元素,则其对象由 JSONObject 表示。 zz 所以替换这个:

JSONArray subjects = (JSONArray)jsonObject.get("Subjects");
Iterator iterator = subjects.iterator();
while (iterator.hasNext()) {
      System.out.println(iterator.next());
}

如下(我没有编译):

JSONObject subjects = (JSONObject)jsonObject.get("Subjects");
for(Iterator iterator = subjects.keySet().iterator(); iterator.hasNext();) {
    String key = (String) iterator.next();
    System.out.println(key + ": " + subjects.get(key));
}

正如其他人提到的,您应该在代码中将 JSONArray 替换为 JSONObject。但我建议一起切换到不同的 JSON 库。我建议使用 Json-Jackson 库。此外,还有另一个库提供了 Json-Jackson 库的包装器。它有 JsonUtils class 可以简单地在一行中解析你的 JSON 。只需先将文件中的 Json 读入字符串 jsonString 并执行此操作。

Map<String, Object> myMap = JsonUtils.readObjectFromJsonString(jsonString, Map.class);

您将获得一个带有一个键“Subjects”的地图,该地图的值将是一个带有您的 3 个键和值的地图:

subject1: MIS
subject2: DBMS
subject3: UML

这是 JsonUtils class. The library could be found as Maven artifact and on Github 的 JavaDoc(包括源代码和 Javadoc)。