我是 JSON 新手,阅读了一些教程,查看了 API 并搜索了相关帖子。我已经将 javax.json-1.0.4 JAR 添加到我的项目中 ( http://mvnrepository.com/artifact/org.glassfish/javax.json/1.0.4 )。我需要从 JSON 文件中检索一些我将在算法中使用的信息。示例 JSON 文件的摘录:
"topology": "sndlib_raw:/sndlib_atlanta",
"server_kind": "uniform",
"success": 1,
"algorithm": "BachelorthesisCR",
"spread_factor": Infinity,
"r_client": "{0: 12, 1: 1, 2: 0}",
"tried_scalings": NaN,
"service_rate": NaN,
"jobid": "00a77fbd-1167-4843-bd3e-7754125fc173",
"templateshort": "Video",
"graph": {
"nodes": {
"0": {
"geolocation": [
-0.20689655172414234,
-2.3478260869565304
],
"name": "N1",
"kcost": 0.0,
"k": 6,
"plot_coord": [
177.65217391304347,
89.793103448275858
],
"ar": 0,
"sr": 1.0,
"users": 0
},
"1": {
"geolocation": [
-19.655172413793096,
129.13043478260869
...
"edges": {
"0,7": {
"lat": 0.0,
"dr": 30.0,
"geodistance": 8882.5879243898
},
"0,6": {
"lat": 0.0,
"dr": 30.0,
"geodistance": 8756.266243327267
},
文件中的大部分信息与我无关。我只对“r_client”、节点及其一些信息以及其他一些内容感兴趣。因此,我认为使用 JSON 对象模型 API 可能比使用 Streaming API 更容易。
在测试程序中,我想读取并打印节点名称:
public JSONReader (String input) throws FileNotFoundException {
inputFile = input;
reader = Json.createReader(new FileReader(inputFile));
jsonst = reader.read();
}
public void read () {
JsonObject obj = reader.readObject();
JsonArray results = obj.getJsonArray("nodes");
int i = 0;
String nodeName = "" + i;
for (JsonObject result : results.getValuesAs(JsonObject.class)) {
System.out.println(result.getJsonObject(nodeName).getString("name"));
i++;
nodeName = "" + i;
}
}
但是,我不确定何时使用 JsonObject 以及何时使用 JsonArray。我是否应该使用 JsonReader 还是 JsonParser?我不需要更改 JSON 文件。 当我启动程序时,我收到“JsonParsingException:意外的字符78”。根据现有的帖子,这是因为未引用的内容,例如“tried_scalings”:NaN,其中 NaN 未引用。我尝试了 JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES;正如某处所建议的,但它不起作用。或者只有 jackson 才有可能(有什么区别?)?
如何在不知道名称的情况下遍历“边缘”子树的所有节点?
最佳答案
您的 JSON 不是有效的 JSON - Infinity 和 NaN 不是 JSON 中的关键字(它不是 JavaScript)。通过一个像样的 linter 来传递它,例如使用http://jsonlint.com
如果您想要更轻松的操控(并且非常快),请选择 jackson 。
Maven:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.4.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.3</version>
</dependency>
Java:
public static void main (String [] args) throws IOException
{
ObjectMapper mapper = new ObjectMapper (); // can reuse, share globally
mapper.configure (Feature.ALLOW_NON_NUMERIC_NUMBERS, true);
JsonNode tree = mapper.readTree (new File ("foo.json"));
// assuming "edges" is a property of the root object
final JsonNode edges = tree.get ("edges");
for (JsonNode edge : edges)
{
final double lat = edge.get ("lat").asDouble ();
final double dr = edge.get ("dr").asDouble ();
final double geodistance = edge.get ("geodistance").asDouble ();
}
}
至于你后面关于如何遍历 JsonNode
的问题- 来吧,一切都在 JavaDoc 中。一个JsonNode
实现Iterable<JsonNode>
当涉及到迭代时,这是最简单的......
关于java - JSON + Java 入门遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27049409/