【问题标题】:Json parsing: Iterating through the values?Json 解析:遍历值?
【发布时间】:2017-05-02 12:12:58
【问题描述】:

我正在尝试使用 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
    }
}

基本上,我想达到第 2 部分中的“类型”值,并在途中添加所有值。最后的意思是我想要总和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 解析器库?换句话说,哪个不会导致许可问题?

【问题讨论】:

  • 您的示例不是有效的 JSON。缺少两个花括号。

标签: java json


【解决方案1】:

你可以递归地遍历键,但你不能计算总和,结果将是不可预测的。

jsonObject.keySet 不保证返回键的顺序与它们在文件中出现的顺序相同。

【讨论】:

    【解决方案2】:

    使用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)。

    【讨论】:

    • 恐怕我不明白您发布的链接中的说明。当我按原样运行您的代码时,输​​出为:10 46 93 118 Do I have to use OpenJDK?
    • 如果打印多于 10 个,那么您使用不同的输入文件。如您所见,代码不会在第一个“Type”键之后停止。如果你想让它停止,你必须在打印总和后添加returnexit。您不需要 OpenJDK。我以 OpenJDK 为例。来自 Oracle 的文档(第一个链接)。
    猜你喜欢
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2018-09-25
    • 2015-09-21
    相关资源
    最近更新 更多