Bhavesh Patadiya
Bhavesh Patadiya

Reputation: 25830

get array of KEYS for each element under jsonarray

I want to parse my Json array dynamically. and want to get array of KEYS for each element under jsonarray. i an getting this through iterator. but not getting the sequeance as per the output json formate.

my 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"
    }
  ]
}

here is My Code :

    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);

What i am getting in logcate output:

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

What i want :

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

Upvotes: 16

Views: 6785

Answers (5)

Behnam
Behnam

Reputation: 2278

Use GSON library from google. It has a a lot of setting to read/create/parse json array and json objects. I didn't test it to find the solution, but I think it's very simple and full featured tool and can solve the problem.

Upvotes: 6

Dominic
Dominic

Reputation: 3483

There is also the method names();

Returns an array containing the string names in this object.

Edit: returns names in undefined order. Suggestions: parse it on your own

Upvotes: 3

Arun George
Arun George

Reputation: 18592

The JSONObject documentation (link: http://developer.android.com/reference/org/json/JSONObject.html) has the following description for the keys() function:

public Iterator keys ()

Since: API Level 1

Returns an iterator of the String names in this object. The returned iterator supports remove, which will remove the corresponding mapping from this object. If this object is modified after the iterator is returned, the iterator's behavior is undefined. The order of the keys is undefined.

So you may get the keys but the order is undefined. You may use any of the sorting algorithms if you want the keys in any particular order.

EDIT

Since you are unaware of the order of KEYS you are getting from the WS, after receiving the data you may show the details on screen in an ordered format . After building the arraylist KEYS, you may sort it alphabetically using the following:

Collections.sort(KEYS);  

This will order the Strings in the KEYS arraylist according to its natural ordering (which is alphabetically).

Upvotes: 12

pawelzieba
pawelzieba

Reputation: 16082

Use different library to parse json dynamically.

Below I wrote a piece of code based on Jackson JSON Processor, which is the best JSON library in my opinion

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());
        }
    }

}

It simply prints out field names in the same order as in json:

ShipmentNumber
Customer
DateCreated
CustomerName

EDIT

Naturally you can use other libraries like gson etc. But remember, as is written on json.org, that:

An object is an unordered set of name/value pairs.

and the order of keys depends on implementation and might vary in each request.

Upvotes: 4

RobinHood
RobinHood

Reputation: 10969

I just come to know when I press ctlr+space bar, in which its clearly written that behavior of the keys is undefined, orders is not maintain by keys.

enter image description here

Arun George said@ correctly that you have to use any sorting method to achieve your goal.

and for sorting may be this link will help you.

Upvotes: 6

Related Questions