【问题标题】:Getting Keys and Values of a JSON Array in the specific order按特定顺序获取 JSON 数组的键和值
【发布时间】:2013-09-05 20:25:18
【问题描述】:

我是 Java 的新手,我正在用它来教我的 Lego NXT 机器人走出迷宫的一些方法。算法参数应外包并加载到代码中,这就是我使用 JSON 的原因。 我的 JSON 文件非常简单(左手算法):

{"algorithm": 
    {
      "onGapLeft": "moveLeft",
      "onGapFront": "moveForward",
      "onGapRight": "moveRight",
      "default": "moveBackward"
    }
}

按顺序读取此文件非常重要。 IE。如果你改变左右算法将成为右手算法。 这是迄今为止的Java代码,我希望你明白我想要做什么。顺便说一句:我正在使用JSON.simple

private static void loadAlgorithm() throws InterruptedException {

        JSONParser parser = new JSONParser();


            Object obj = parser.parse(new FileReader("lefthand.json"));             
            JSONObject jsonObject = (JSONObject) obj;
            JSONArray algorithm = (JSONArray) jsonObject.get("algorithm");
            int length = algorithm.size();

        for(int i = 0; i < length; i++)
        {
            switch (algorithm[i].key)
            {
                 case "onGapLeft" :  leftPos = i; break;
                 case "onGapFront": frontPos = i; break;
                 case "onGapRight": rightPos = i; break;
                 default: break;
            }

            switch (algorithm[i].value)
            {
                 case "moveLeft"    : directionAlgorithm[i] = direction.Left;     break;
                 case "moveFront"   : directionAlgorithm[i] = direction.Forward;  break;
                 case "moveRight"   : directionAlgorithm[i] = direction.Right;    break;
                 case "moveBackward": directionAlgorithm[3] = direction.Backward; break;
                 default: break;
            }
        }           
    }

我现在需要知道是否可以获得密钥字符串(我实际上使用 algorithm[i].key 的地方)以及值字符串(algorithm[i].value)的相同。

非常感谢您的帮助!

【问题讨论】:

  • 我认为它不能完全解决您的问题,但是您将“算法”误解为 JSONArray。它实际上是一个 JSONObject,这意味着就像从根对象中获取“算法”一样,您可以从算法对象中获取“onGapLeft”/“onGapFront”值。数组的值用 [] 括号和逗号按顺序声明,并且没有字符串标签(例如:["moveLeft", "moveRight"]
  • 是的,该 JSON 中没有“数组”。并且“对象”(地图/字典)中的条目顺序是“未定义的”——即使它们以一种顺序到达,解析 JSON 的代码也可以合法地重新排列它们。
  • (有人想知道为什么你有单个值的键名,如果它们总是按给定的顺序排列。如果你是这样的话,只有一个 [moveLeft, moveForward, moveRight, moveBackward] 的数组会更有意义想要。或者将键名设为“firstMove”、“secondMove”、“thirdMove”、“fourthMove”。)
  • (有关 JSON 规范,请参阅 json.org。学习只需 5-10 分钟。)
  • 谢谢大家!因此,如果我像下面所述的 zigdawgydawg 那样更改 JSON,那么它会被排序吗? @HotLicks:这将是一个解决方案,但我们希望它更可定制,因此我们添加了这两个价值解决方案! :)

标签: arrays json loops


【解决方案1】:

您可能应该更改您的 JSON 以便对其进行排序,如下所示:

{"algorithm": 
    [
        { "key": "onGapLeft", "value" : "moveLeft" },
        { "key": "onGapFront", "value" : "moveForward" },
        { "key": "onGapRight", "value" : "moveRight" },
        { "key": "default", "value" : "moveBackward" }
    ]
}

然后相应地修改您的 Java。

【讨论】:

  • 谢谢!这是否解决了 Katana314 所说的问题,即我的 JSON 文件目前不是数组? :) 然后是否可以通过“algorithm[i].key”进行迭代?即 algorithm[0].key 将是 OnGapLeft? :)
  • 是的......它确实解决了@Katana314 提到的问题。 JSON 中的 [...] 是一个正确的(有序的)数组。在遍历algorithm JSONArray 时,使用JSONObject obj2 = (JSONObject) algorithm.get(i); 获取每个索引处的JSONObject,然后获取该对象的键obj2.get("key");。我希望这会有所帮助。
  • 好的!现在我只有一个初始化问题。这条线:Object obj = parser.parse(new FileReader("lefthand.json")); 有一个错误说:“未处理的异常类型 ParseException”有什么建议吗? (正如我所说:我对 Java 和 Eclipse 完全陌生,有时我不明白它想告诉我什么:)
  • 您要么需要将该行包装在 try/catch 块中,要么明确指定 loadAlgorithm 方法 throws ParseException。以下是有关这两个选项的更多信息:here
  • 非常感谢!这有帮助,程序编译,一切正常。现在的大问题:那个该死的乐高机器人不理解 simpleJSON。我现在必须通过一个非库但 java 文件 json lib 自己工作。我希望这不是太复杂。我想我现在要哭一会儿了。无论如何谢谢;)
【解决方案2】:

我对 JSON 不熟悉,但由于 JSONObject 由 HashMap 支持,因此您可以按以下相同顺序将键和值放入数组中,

Map<K, V> map = new HashMap<K, V>();
K[] keys = new K[map.size()];
V[] values = new V[map.size()];
int index = 0;
for (Map.Entry<K, V> mapEntry : map.entrySet()) {
    keys[index] = mapEntry.getKey();
    values[index] = mapEntry.getValue();
    index++;
}

【讨论】:

    猜你喜欢
    • 2022-11-02
    • 2021-12-05
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    相关资源
    最近更新 更多