java - JSON + Java 入门遇到问题

标签 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:意外的字符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/

相关文章:

Java Swing Combobox removeAllItems 也调用 ItemStateChanged 吗?

java - Jar文件显示的屏幕尺寸与IntelliJ不同

json - 包含一个元素的 jaxb 列表

ios - SwiftyStoreKit解析收据

java - Kafka Streams 本地状态存储

java - Hibernate 将 NULL 插入原始类型字段

c# - 使用 JavaScriptSerializer 反序列化 JSON

javascript - Highstock 更新数据 getJson

c++ - Yacc 语法产生不正确的终端

c# - .NET 日期时间解析