无法开始使用JSON + Java

时间:2014-11-20 20:56:01

标签: java json parsing

我是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的所有节点?

1 个答案:

答案 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>,它就像迭代时一样简单......