Подтвердить что ты не робот

Получить массив KEYS для каждого элемента под jsonarray

Я хочу динамически анализировать массив Json. и хотите получить массив KEYS для каждого элемента под jsonarray. я получаю это через итератор. но не получая sequance в соответствии с выходом json formate.

мой 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"
    }
  ]
}

здесь Мой код:

    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]
4b9b3361

Ответ 1

Документация JSONObject (ссылка: http://developer.android.com/reference/org/json/JSONObject.html) имеет следующее описание функции keys():

общедоступные ключи итератора()

Поскольку: Уровень API 1

Возвращает итератор имен строк в этом объекте. Возвращенный итератор поддерживает удаление, которое удалит соответствующее сопоставление от этого объекта. Если этот объект изменяется после того, как итератор return, поведение итератора undefined. Порядок ключей undefined.

Итак, вы можете получить ключи, но порядок undefined. Вы можете использовать любой алгоритм сортировки, если вы хотите использовать ключи в любом конкретном порядке.

ИЗМЕНИТЬ

Поскольку вы не знаете о заказе KEYS, который вы получаете из WS, после получения данных вы можете отображать детали на экране в упорядоченном формате. После создания arraylist KEYS вы можете отсортировать его по алфавиту, используя следующее:

Collections.sort(KEYS);  

Это упорядочивает Strings в KEYS arraylist в соответствии с его естественным порядком (который в алфавитном порядке).

Ответ 2

Я просто узнаю, когда я нажимаю ctlr + пробел, в котором четко написано, что поведение клавиш undefined, заказы не поддерживаются ключами.

enter image description here

Арун Джордж сказал @правильно, что вы должны использовать любой метод сортировки для достижения своей цели.

и для сортировки может оказаться ссылка .

Ответ 3

Используйте GSON библиотеку из Google. Он имеет множество настроек для чтения/создания/анализа json-массива и json-объектов. Я не тестировал его, чтобы найти решение, но я думаю, что это очень простой и полнофункциональный инструмент и может решить проблему.

Ответ 4

Используйте разную библиотеку для динамического разбора 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.org, что:

Объект представляет собой неупорядоченный набор пар имя/значение.

и порядок ключей зависит от реализации и может варьироваться в каждом запросе.

Ответ 5

Существует также метод names();

Возвращает массив, содержащий имена строк в этом объекте.

Изменить: возвращает имена в порядке undefined. Предложения: проанализируйте его самостоятельно