Android 获取jsonarray下每个元素的键数组

Android 获取jsonarray下每个元素的键数组,android,json,arraylist,iterator,arrays,Android,Json,Arraylist,Iterator,Arrays,我想动态解析我的Json数组。并希望获得jsonarray下每个元素的键数组。我需要通过迭代器来实现这一点。但是没有按照输出json格式获取序列 我的JSON格式: { "result": "Success", "AlertDetails": [ { "ShipmentNumber": "SHP34", "Customer": "BEST", "DateCreated": "2012-08-29T04:59:18Z" "Custom

我想动态解析我的Json数组。并希望获得jsonarray下每个元素的键数组。我需要通过迭代器来实现这一点。但是没有按照输出json格式获取序列

我的JSON格式:

{
  "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);
 ---- KEYS---- [DateCreated,CustomerName, Customer, ShipmentNumber]
 ---- KEYS---- [ShipmentNumber, Customer, DateCreated,CustomerName]
这是我的代码:

{
  "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);
 ---- KEYS---- [DateCreated,CustomerName, Customer, ShipmentNumber]
 ---- KEYS---- [ShipmentNumber, Customer, DateCreated,CustomerName]
我在logcate输出中得到的信息:

{
  "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);
 ---- KEYS---- [DateCreated,CustomerName, Customer, ShipmentNumber]
 ---- KEYS---- [ShipmentNumber, Customer, DateCreated,CustomerName]
我想要什么:

{
  "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);
 ---- KEYS---- [DateCreated,CustomerName, Customer, ShipmentNumber]
 ---- KEYS---- [ShipmentNumber, Customer, DateCreated,CustomerName]

JSONObject文档(链接:)对
keys()
函数有以下描述:

公共迭代器密钥()

自:API级别1

返回此对象中字符串名称的迭代器。返回 迭代器支持remove,这将删除相应的映射 从这个物体。如果在调用迭代器后修改此对象 返回时,迭代器的行为未定义键的顺序 是未定义的

因此,您可以获得密钥,但顺序未定义。如果您希望密钥按任何特定顺序排列,则可以使用任何排序算法

编辑

由于您不知道从WS获得的键的顺序,因此在收到数据后,您可以在屏幕上以顺序格式显示详细信息。构建
阵列列表
后,可以使用以下命令按字母顺序对其排序:

Collections.sort(KEYS);  
这将根据其自然顺序(按字母顺序)对
键中的
字符串
进行排序

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


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

当我按下ctlr+空格键时,我才知道,空格键上清楚地写着键的行为是未定义的,键不能维持顺序

阿伦·乔治(Arun George)正确地说,你必须使用任何排序方法来实现你的目标


对于排序,这可能会帮助您。

使用不同的库动态解析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数组和json对象。我没有测试它以找到解决方案,但我认为它是一个非常简单且功能齐全的工具,可以解决问题。

@lazynija不,它只是一个名称。@lazynija是的,它是一个数组列表。你能帮我摆脱这一切吗?如果你能给我一些关于这个问题的建议,那就太好了。没有人告诉过你JSON对象不遵循任何特定的顺序…两个输出都是相同的,按照JSON格式…现在的问题是,为什么你要在特定的格式下使用它???@MKJParekh:thnx以获得你的支持。但是我想在我的屏幕中以列名称的形式显示每个键名称,格式与我从WS-Response获得的相同。我事先不知道这些键。然后在WS-Response中再添加一个东西..一个JSON对象,其键名的值为其索引ID 1,名称2日期3..如此。。。然后决定…谢谢你的支持。你能给我推荐一种算法来解决这个问题吗?它能给我一个Arraylist,它的键顺序和我在WS中得到的键顺序相同吗?是的,你是对的。我也试过了,但它也给了我使用key()方法得到的相同的未定义键顺序。如果你有更多的建议来解决这个问题,那就太好了。然后我建议你自己解析它