【发布时间】:2019-03-19 12:39:33
【问题描述】:
首先.. 如果缺少某些信息,请询问,我会提供所需的输入。
我的桌面上有一个 .json 文件,现在我必须使用 java 并且必须从 .json 文件中提取值。 这是我的任务:**编写一个提取值的脚本 “自动 -> 内核 -> 发布” 从附加的 json 文件中取出。
示例:输出:
3.16.0-5-amd64**
json文件有27k+行,不知道这个会不会有问题。
.json 文件包括:
1 {
2 “results”: 3,
3 “rows”: [
4 {
5 “name”: “test”,
6 “chef_environment”: “office”,
7 “json_class”: “Chef::Node”,
8 “automatic”: {
9 “nginx”: {
10 “version”: null,
11 “configure_arguments”: [
12
13 ],
14 “prefix”: null,
15 “conf_path”: null
16 },
.....
98 “kernel”: {
99 “name”: “Linux”,
100 “release”: “3.16.0-5-amd64"
这是我现在的代码:
package json;
import java.io.*;
import java.io.File;
import java.io.FileReader;
import org.json.simple.parser.ParseException;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.JSONArray;
import java.util.Iterator;
public class json {
public static void main(String[] args) throws Exception {
JSONParser parser = new JSONParser();
try {
Object obj = parser.parse(new FileReader("C:\\Users\\admin-elias\\Desktop\\nginx.json"));
JSONObject jsonObject = (JSONObject) obj;
String automatic = (String) jsonObject.get("automatic");
String kernel = (String) jsonObject.get("kernel");
JSONArray release = (JSONArray) jsonObject.get("release");
System.out.println("automatic: "+automatic);
System.out.println("kernel: "+kernel);
System.out.println("release: "+release);
;
} catch (Exception e) {
e.printStackTrace();
}
}
}
当我尝试运行程序时,我收到以下错误:
java.lang.NumberFormatException: For input string: "18446744073709551615"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.base/java.lang.Long.parseLong(Long.java:692)
at java.base/java.lang.Long.valueOf(Long.java:1144)
at org.json.simple.parser.Yylex.yylex(Yylex.java:660)
at org.json.simple.parser.JSONParser.nextToken(JSONParser.java:269)
at org.json.simple.parser.JSONParser.parse(JSONParser.java:118)
at org.json.simple.parser.JSONParser.parse(JSONParser.java:92)
at json.json.main(json.java:18)
我做错了什么?我对 java 比较陌生,我需要让这个程序运行,所以每一个建议或帮助都会非常好。 :)
编辑:
我终于得到了完美运行的代码:
public class json {
public static void main(String[] args) throws Exception {
try {
JsonReader jsonReader = new JsonReader(new FileReader("filename"));
Gson gson = new Gson();
JsonElement json = gson.fromJson(jsonReader, JsonElement.class);
//JsonElement json = new JsonParser().parse(jsonString);
JsonArray array = json.getAsJsonObject().get("rows").getAsJsonArray();
int length = array.size();
for (int i = 0; i < length; i++) {
System.out.println(array.get(i).getAsJsonObject().get("automatic").getAsJsonObject().get("kernel").getAsJsonObject().get("release").getAsString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
【问题讨论】:
-
这个数字 18446744073709551615 不适合长
-
Gson 库支持开箱即用的大整数。您是否可以使用 Gson 而不是简单的解析器? mvnrepository.com/artifact/com.google.code.gson/gson/2.8.5
-
好吧@PatrickDorn 那我想我必须写一个完整的新代码?尚未使用 Gson,但也许值得一试。
-
不应该太难。 Gson 支持 FileReader 作为输入,并且有自己的 com.google.gson.JsonObject 和 com.google.gson.JsonArray 类。解析:JsonObject obj = gson.fromJson(fileReader, JsonObject.class);
-
好的酷@PatrickDorn 谢谢你的帮助,我会试试看:)