我从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进行了测试,发现订单无法确定。有没有办法实现这个目标?
答案 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将以正确的顺序迭代。