我是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:意外的char 78"。根据现有帖子,这是因为没有引用过的东西,例如" trying_scalings":NaN,其中没有引用NaN。我试过JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES;正如某处所建议的那样,但它并没有奏效。或者只有Jackson才有可能(差异是什么?)?
如何在不知道姓名的情况下遍历" edge" -subtree的所有节点?
答案 0 :(得分:2)
您的JSON不是有效的JSON - Infinity和NaN不是JSON中的关键字(它不是JavaScript)。通过一个体面的linter传递它,例如使用http://jsonlint.com
如果你想要更宽松的处理(并且非常快)去杰克逊。
的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>
爪哇:
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>
,它就像迭代时一样简单......