Arrays 按特定顺序获取JSON数组的键和值

Arrays 按特定顺序获取JSON数组的键和值,arrays,json,loops,Arrays,Json,Loops,我对Java非常陌生,我用它来教我的乐高NXT机器人走出迷宫的方法。算法参数应外包并加载到代码中,因此我使用JSON。 我的JSON文件非常简单(左手算法): 按顺序读取此文件非常重要。也就是说,如果你改变左右,算法将变成右手算法。 这是到目前为止的Java代码,我希望您理解我的意图。顺便说一句:我在用 private static void loadAlgorithm()抛出InterruptedException{ JSONParser=新的JSONParser(); objectobj=p

我对Java非常陌生,我用它来教我的乐高NXT机器人走出迷宫的方法。算法参数应外包并加载到代码中,因此我使用JSON。 我的JSON文件非常简单(左手算法):

按顺序读取此文件非常重要。也就是说,如果你改变左右,算法将变成右手算法。 这是到目前为止的Java代码,我希望您理解我的意图。顺便说一句:我在用

private static void loadAlgorithm()抛出InterruptedException{
JSONParser=新的JSONParser();
objectobj=parser.parse(新文件阅读器(“lefthand.json”);
JSONObject JSONObject=(JSONObject)对象;
JSONArray算法=(JSONArray)jsonObject.get(“算法”);
int length=algorithm.size();
for(int i=0;i
我现在需要知道是否可以获取键字符串(在这里我使用了算法[I].key),是否可以获取值字符串(算法[I].value)


非常感谢你的帮助

您可能应该更改JSON,使其按顺序排列,如下所示:

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

然后相应地修改Java。

我不熟悉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++;
}
Map Map=newhashmap();
K[]keys=新的K[map.size()];
V[]值=新的V[map.size()];
int指数=0;
对于(Map.Entry mapEntry:Map.entrySet()){
keys[index]=mapEntry.getKey();
values[index]=mapEntry.getValue();
索引++;
}

我认为它不能完全解决您的问题,但您将“算法”误解为JSONArray。它实际上是一个JSONObject,这意味着就像从根对象获取“算法”一样,可以从算法对象获取“onGapLeft”/“onGapFront”值。数组用[]方括号和逗号顺序声明其值,并且没有字符串标签(例如:[“moveLeft”、“moveRight”]是的,JSON中没有“array”。“object”(映射/字典)中条目的顺序是“未定义的”--即使它们以一个顺序到达,解析JSON的代码也可以合法地重新排列它们。(如果单个值总是以给定的顺序出现,人们会想知道为什么要为它们指定键名。只需要一个
[moveLeft,moveForward,moveRight,moveBackward]数组就更有意义了。)
,如果您需要的话。或者将关键名称设置为“firstMove”、“secondMove”、“thirdMove”、“fourthMove”。(有关json规范,请参阅json.org。学习只需5-10分钟。)谢谢大家!如果我像下面提到的zigdawgydawg那样更改JSON,那么它将被排序?@HotLicks:这将是一个解决方案,但我们希望它更易于定制,在我们添加这个双值解决方案之前!:)谢谢!这是否解决了Katana314所说的问题,即我的JSON文件目前不是数组那么,是否有可能通过“算法[i].key”来迭代thorugh呢?i、 e.算法[0]。键应为OnGapLeft:)是的……它确实解决了@Katana314提到的问题。JSON中的
[…]
是一个正确的(有序的)数组。在迭代
算法
JSONArray时,使用
JSONObject obj2=(JSONObject)算法获取每个索引处的JSONObjectobj2.get(“键”)。我希望这有帮助。好的!现在我只有一个初始化问题。行:
objectobj=parser.parse(新文件阅读器(“lefthand.json”)有一个错误:“未处理的异常类型ParseException”有什么建议吗?(正如我所说:我对Java和Eclipse完全陌生,有时我不明白它想告诉我什么:)您要么需要将该行包装在try/catch块中,要么明确指定
loadAlgorithm
方法
抛出ParseException
。下面是关于这两个选项的更多信息:非常感谢!这很有帮助,程序编译后,一切都很好。现在的大问题是:那个该死的乐高机器人不懂simpleJSON。我现在必须通过一个非库,但java文件json lib来工作。。我希望这不太复杂。我想我现在要哭一点了。无论如何,谢谢你;)
{"algorithm": 
    [
        { "key": "onGapLeft", "value" : "moveLeft" },
        { "key": "onGapFront", "value" : "moveForward" },
        { "key": "onGapRight", "value" : "moveRight" },
        { "key": "default", "value" : "moveBackward" }
    ]
}
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++;
}