获取jsonarray下每个元素的KEYS数组

时间:2012-08-29 10:19:36

标签: android json arraylist iterator arrays

我想动态解析我的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]

5 个答案:

答案 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 +空格键时,其中明确写明的行为是未定义的,订单不是由密钥。

enter image description here

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)

还有方法names();

  

返回包含此对象中字符串名称的数组。

编辑:以未定义的顺序返回名称。建议:自己解析