从第一个元素到最后一个元素迭代json

时间:2015-07-20 20:02:05

标签: java json

我从json获取数据,其外观顺序很重要。也就是说,索引0处的元素应该在索引1处的元素之前,依此类推。

使用下面的代码片段遍历json(每个对象的键也将被使用。)

JSONObject jObject = new JSONObject(string);
            Iterator<String> keys = jObject.keys();
            node = doc.createElement("ul");
            while (keys.hasNext()) {
                String _keys = (String) keys.next();
                System.out.println(_keys); //other codes are here}

问题是这不会从头到尾访问json对象。用样品json进行了测试,发现订单无法确定。有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:1)

根据定义,JSON对象没有成员顺序。如果顺序很重要,请使用数组,如果顺序是字母顺序,则对键进行排序并在排序列表上进行迭代。

答案 1 :(得分:0)

使用Jackson JSONObject转换为LinkedHashMap,维护密钥顺序。

    LinkedHashMap <String,String> map =
            new ObjectMapper().readValue(<JSON_OBJECT>, LinkedHashMap .class);
    for (Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}

答案 2 :(得分:0)

JSON本身不提供关键数据的订单。但是,某些JSON库允许它。如果您能够使用第三方库,json-simple提供了一种方式:https://code.google.com/p/json-simple/

您可以创建一个由LinkedHashMap(From https://code.google.com/p/json-simple/wiki/DecodingExamples#Example_4_-_Container_factory)支持的JSON对象,而不是创建由HashMap支持的JSON对象:

String jsonText = "{\"first\": 123, \"second\": [4, 5, 6], \"third\": 789}";
JSONParser parser = new JSONParser();
ContainerFactory containerFactory = new ContainerFactory(){
    public List creatArrayContainer() {
        return new LinkedList();
    }

    public Map createObjectContainer() {
        return new LinkedHashMap();
    }

};

try {
    Map json = (Map)parser.parse(jsonText, containerFactory);
    Iterator iter = json.entrySet().iterator();
    System.out.println("==iterate result==");
    while(iter.hasNext()){
        Map.Entry entry = (Map.Entry)iter.next();
        System.out.println(entry.getKey() + "=>" + entry.getValue());
    }

    System.out.println("==toJSONString()==");
    System.out.println(JSONValue.toJSONString(json));
}
catch(ParseException pe){
    System.out.println(pe);
}

最终结果是Map将以正确的顺序迭代。