17

我想动态解析我的 Json 数组。并希望为 jsonarray 下的每个元素获取 KEYS 数组。我通过迭代器得到这个。但没有根据输出的 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);

我在 logcate 输出中得到什么:

 ---- KEYS---- [DateCreated,CustomerName, Customer, ShipmentNumber]

我想要的是 :

 ---- KEYS---- [ShipmentNumber, Customer, DateCreated,CustomerName]
4

5 回答 5

12

JSONObject 文档(链接: http: //developer.android.com/reference/org/json/JSONObject.htmlkeys() )对该函数有以下描述:

公共迭代器键 ()

自:API 级别 1

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

所以你可能会得到钥匙,但顺序是不确定的。如果您想要任何特定顺序的键,您可以使用任何排序算法。

编辑

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

Collections.sort(KEYS);  

这将根据其自然顺序Strings字母顺序)排序。KEYS arraylist

于 2012-08-31T13:18:39.760 回答
6

当我按下ctlr+space bar时,我才知道,其中清楚地写着的行为是未定义的,命令不是由键维护的。

在此处输入图像描述

Arun George说得对@你必须使用任何排序方法来实现你的目标。

对于排序,此链接可能会对您有所帮助。

于 2012-08-31T13:37:00.970 回答
6

使用谷歌的GSON库。它有很多设置来读取/创建/解析 json 数组和 json 对象。我没有测试它以找到解决方案,但我认为它是一个非常简单且功能齐全的工具,可以解决问题。

于 2012-09-01T05:18:11.587 回答
4

使用不同的库来动态解析 json。

下面我基于 Jackson JSON Processor 写了一段代码,这是我认为最好的 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上所写的那样:

对象是一组无序的名称/值对。

并且键的顺序取决于实现,并且可能在每个请求中有所不同。

于 2012-08-31T13:51:21.607 回答
3

还有方法名();

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

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

于 2012-08-31T13:23:44.907 回答