Json解析:迭代值?

时间:2017-05-02 12:12:58

标签: java json

我试图使用json.simple从这个json文件中获取内容:

"Main": {
    "Part1":{
        "Length": 2,
        "Flags": 2,
        "Sequence": 4
    },
    "Part2":{
        "Length": 2,
        "Type":2,
        "Main_Dest":4,
        "Main_Source":4,
        "Sequence":4,
        "Data": {
            "1":12,
            "2":24
        },
        "Blank": 8
    }
}

基本上,我想要达到" Type" Part2中的值,并在路上添加所有值。最后的含义我想得到总和10(长度+标志+序列+长度)和数字2为值"输入"。我的主要问题是我必须一般地这样做,所以我不能只是按名称收集值,因为它们可能会改变或者可以添加其他值。只有价值" Type"将永远被称为。

到目前为止,我所做的是:

private static void parseJson() {
    String path = "...config.json";
    boolean count = false;
    int sum = 0;
    try {
        FileReader reader = new FileReader(path);
        JSONParser jsonParser = new JSONParser();
        JSONObject jsonObject = (JSONObject) jsonParser.parse(reader);
        jsonObject.entrySet();
        JSONObject main = (JSONObject) jsonObject.get("Main");
        for (Iterator iterator = main.keySet().iterator(); iterator.hasNext();){
            String key = (String) iterator.next();

            //this is where I'm stumped. Do I keep going into the JSONObject until I get to a value?

            if (count){
                sum += (int) sahara.get(key);
            }
            if (key.equals("Type")){
                count = true;
            }

        }
        System.out.println(skip);
    } catch (Exception e) {

    }

}

显然,我真的不知道自己在做什么。如何迭代json文件中的最低级别?

作为一个小问题,如果我可以出售我的软件,我应该使用哪些Json解析器库?换句话说,哪个不会导致许可问题?

2 个答案:

答案 0 :(得分:2)

您可以递归迭代键,但无法计算总和,结果将无法预测。

jsonObject.keySet不保证以与文件中出现的顺序相同的顺序返回密钥。

答案 1 :(得分:1)

使用stream API for Json

我添加了缺少的大括号来修复您的输入。

{
  "Main": {
    "Part1":{
      "Length": 2,
      "Flags": 2,
    "Sequence": 4
    },
    "Part2":{
      "Length": 2,
      "Type":2,
      "Main_Dest":4,
      "Main_Source":4,
      "Sequence":4,
      "Data": {
        "1":12,
        "2":24
      },
      "Blank": 8
    }
  }
}

此示例显示了如何使用流API。

// -*- compile-command: "javac -cp javax.json-1.0.jar q43737601.java && java -cp .:javax.json-1.0.jar q43737601"; -*-

import java.io.FileReader;
import javax.json.Json;
import javax.json.stream.JsonParser;

class q43737601
{
  public static void main (String argv[]) throws Exception
  {
    String path = "config.json";
    int sum = 0;

    JsonParser p = Json.createParser (new FileReader (path));
    while (p.hasNext()) {
      JsonParser.Event e = p.next();
      switch (e) {
      case VALUE_NUMBER:
        sum += Integer.parseInt(p.getString());
        break;
      case KEY_NAME:
        if ("Type".equals(p.getString()))
          System.out.println(sum);
        break;
      }
    }
  }
}

如果你运行它,它会显示10.该例子将所有数字加起来直到名为“Type”的键。

我用OpenJDK尝试了上面的例子。有必要按照this回答中解释的步骤进行操作。我必须在编译命令中设置类路径(-cp)。