为什么无法读取 .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)。
我想使用库 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)。