我想动态解析我的Json数组。并希望获得jsonarray下每个元素的KEYS数组。我通过迭代器得到这个。但是没有根据输出json formate获得序列。
我的JSON Formate:
{
"result": "Success",
"AlertDetails": [
{
"ShipmentNumber": "SHP34",
"Customer": "BEST",
"DateCreated": "2012-08-29T04:59:18Z"
"CustomerName": "BEST"
},
{
"ShipmentNumber": "SHP22",
"Customer": "BEST",
"DateCreated": "2012-08-29T05:34:18Z"
"CustomerName": "Jelly"
}
]
}
这是我的代码:
JSONArray array = jsonobject.getJSONArray("AlertDetails");
JSONObject keyarray = array.getJSONObject(0);
Iterator temp = keyarray.keys();
while (temp.hasNext()) {
String curentkey = (String) temp.next();
KEYS.add(curentkey);
}
Log.d("Parsing Json class", " ---- KEYS---- " + KEYS);
我在logcate输出中获得了什么:
---- KEYS---- [DateCreated,CustomerName, Customer, ShipmentNumber]
我想要的是什么:
---- KEYS---- [ShipmentNumber, Customer, DateCreated,CustomerName]
答案 0 :(得分:12)
JSONObject文档(链接:http://developer.android.com/reference/org/json/JSONObject.html)对keys()
函数有以下描述:
public Iterator keys()
自:API Level 1
返回此对象中String名称的迭代器。归来了 iterator支持remove,这将删除相应的映射 从这个对象。如果在迭代器之后修改此对象 返回,迭代器的行为是未定义的。 键的顺序 未定义。
所以你可能得到钥匙,但订单未定义。如果您想要任何特定顺序的密钥,您可以使用任何排序算法。
修改强>
由于您不知道从WS获取的KEYS顺序,因此在收到数据后,您可以按照有序格式在屏幕上显示详细信息。构建arraylist
KEYS
后,您可以使用以下内容按字母顺序对其进行排序:
Collections.sort(KEYS);
这将根据自然排序(按字母顺序)对Strings
KEYS
中的arraylist
进行排序。< / p>
答案 1 :(得分:6)
我刚才知道当我按下 ctlr +空格键时,其中明确写明键的行为是未定义的,订单不是由密钥。
Arun George 正确地说@你必须使用任何排序方法来实现你的目标。
并且对于排序可能是这个link会帮助你。
答案 2 :(得分:6)
使用谷歌的GSON库。它有很多设置来读取/创建/解析json数组和json对象。我没有测试它来找到解决方案,但我认为这是非常简单和功能齐全的工具,可以解决问题。
答案 3 :(得分:4)
使用不同的库动态解析json。
下面我写了一段基于Jackson JSON处理器的代码,这是我认为最好的JSON库
public void test() throws IOException {
String str = "{\n" +
" \"result\": \"Success\",\n" +
" \"AlertDetails\": [\n" +
" {\n" +
" \"ShipmentNumber\": \"SHP34\",\n" +
" \"Customer\": \"BEST\",\n" +
" \"DateCreated\": \"2012-08-29T04:59:18Z\",\n" +
" \"CustomerName\": \"BEST\"\n" +
" }\n" +
" ]\n" +
"}";
JsonFactory factory = new JsonFactory();
JsonParser jsonParser = factory.createJsonParser(str);
JsonToken jsonToken;
SerializedString alertDetails = new SerializedString("AlertDetails");
while (!jsonParser.nextFieldName(alertDetails)) { /* move to AlertDetails field */ }
jsonParser.nextToken(); // skip [ start array
jsonParser.nextToken(); // skip { start object
// until } end object
while ((jsonToken = jsonParser.nextToken()) != JsonToken.END_OBJECT) {
if (jsonToken == JsonToken.FIELD_NAME) {
System.out.println(jsonParser.getCurrentName());
}
}
}
它只是以与json中相同的顺序打印出字段名称:
ShipmentNumber
Customer
DateCreated
CustomerName
修改强>
当然你可以使用像gson等其他库。但请记住,正如json.org所写的那样:
对象是一组无序的名称/值对。
并且密钥的顺序取决于实现,并且可能在每个请求中有所不同。
答案 4 :(得分:3)