2012-08-29 11 views
17

我想动态地解析我的Json数组。并希望为jsonarray下的每个元素获取KEYS数组。我通过迭代器得到这个。但没有得到输出json合成器的遗漏。获取jsonarray下每个元素的KEYS数组

我的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] 
+0

是一个数组列表? –

+0

@LazyNinja不,这只是一个名字。 –

+0

@LazyNinja是的,它是一个数组列表。你能帮我解决这个问题吗?如果你给我这个问题的建议会很好。 –

回答

12

的JSONObject的文档(链接:http://developer.android.com/reference/org/json/JSONObject.html)已为keys()功能如下描述:

公共迭代器键()

自:API级别1

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

所以你可能会得到钥匙,但订单是未定义的。如果您想按任何特定顺序键,您可以使用任何排序算法。

编辑

因为你不知道你是从WS获取,接收数据可能会显示一个有序的格式,屏幕上的细节后,按键的顺序。建立arraylistKEYS后,您可以按字母顺序使用下面的排序是:

Collections.sort(KEYS); 

这将在KEYSarraylist根据其自然排序(这是按字母顺序)订购Strings

+1

Thnx为您的支持。你能告诉我任何算法来解决这个问题,并且可以给我具有相同KEYS命令的Arraylist,我从WS获得响应吗? –

3

还有一个方法names();

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

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

+0

是的,你是正确的。我也尝试过,但是这也给了我相同的未定义的密钥,我使用key()方法得到的顺序。如果你有任何更多的建议来解决这个问题,将会非常棒。 –

+0

然后我建议你自己解析它 –

6

我只是来知道当我按下CTLR +空格键,在其写清楚是不确定的这种行为,订单不是由键维持。

enter image description here

阿伦乔治说@正确的,你必须使用任何排序方法来实现自己的目标。

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

+5

这应该是乔治的答案的评论...而不是答案.. – MKJParekh

4

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

下面我写了一个基于杰克逊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写的,叫:

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

并且键的顺序取决于实现并且可能在每个请求中变化。

6

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