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

Posted

技术标签:

【中文标题】获取jsonarray下每个元素的KEYS数组【英文标题】:get array of KEYS for each element under jsonarray 【发布时间】:2012-08-23 22:23:15 【问题描述】:

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

【问题讨论】:

@LazyNinja 不,它只是一个名字。 @LazyNinja 是的,它是一个数组列表。你能帮我摆脱这个吗?如果你给我这个问题的建议会很棒。 没有人告诉你 JSON 对象不遵循任何特定的顺序......根据 json 格式,两个输出都是相等的......现在问题是为什么你想要那个特定的格式? @MKJParekh:thnx 为您提供支持。但我想在我的屏幕中将每个 KEY 名称显示为与我从 WS 响应中获取的相同格式的列名称。我事先不知道 KEYS。 然后在您的 WS 响应中再添加一件事..一个 JSON 对象,其键名和值作为其索引 ID 1,名称 2 日期 3..如此......然后决定.. . 【参考方案1】:

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

公共迭代器键()

自:API 级别 1

返回此对象中字符串名称的迭代器。返回的 iterator 支持remove,会移除对应的mapping 从这个对象。如果这个对象在迭代器被修改之后 返回时,迭代器的行为未定义。 键的顺序 未定义

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

编辑

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

Collections.sort(KEYS);  

这将根据其自然顺序(按字母顺序)在KEYS arraylist 中对Strings 进行排序。

【讨论】:

感谢您的支持。你能建议我解决这个问题的任何算法吗?它可以给我 Arraylist 与我在 WS 的响应中得到的 KEYS 顺序相同?【参考方案2】:

还有names();的方法

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

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

【讨论】:

是的,你是对的。我也试过了,但这也给了我使用 key() 方法得到的相同的未定义键顺序。如果您有任何更多的建议来解决这个问题,将会非常完整。 那我建议你自己解析一下【参考方案3】:

当我按下 ctlr+空格键 时,我才知道,其中清楚地写着 keys 的行为是未定义的,命令不是由 钥匙。

Arun George 正确地说@,你必须使用任何排序方法来实现你的目标。

对于排序可能是这个link 会帮助你。

【讨论】:

【参考方案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 上所写的那样:

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于获取jsonarray下每个元素的KEYS数组的主要内容,如果未能解决你的问题,请参考以下文章

如何获取jsonarray中 某个值

java foreach是不是能对jsonarray进行遍历

获取一个对象的长度

json学习之JSONArray的应用(转载)

js常用方法

java foreach是不是能对jsonarray进行遍历