Android JSON: анализ массива в массиве

Я пытаюсь проанализировать этот вывод JSON:

{
    "answers": [
        {
            "table_data": [
                [
                    {
                        "column_id": 49,
                        "value": "1957"
                    }
                ],
                [
                    {
                        "column_id": 49,
                        "value": "1836"
                    }
                ]
            ]
        },
        {
            "table_data": {
                "0": [
                    {
                        "column_id": 61,
                        "value": "1091"
                    },
                    {
                        "column_id": 62,
                        "value": "2046"
                    }
                ],
                "1": [
                    {
                        "column_id": 61,
                        "value": "467"
                    },
                    {
                        "column_id": 62,
                        "value": "1429"
                    }
                ],
                "2": [
                    {
                        "column_id": 61,
                        "value": "1236"
                    },
                    {
                        "column_id": 62,
                        "value": "2202"
                    }
                ]
            }
        }
    ]
}

используя этот код:

groups = json.getJSONArray(TAG_ANSWERS);
for (int i = 0; i < groups.length(); i++) {
    JSONObject c = groups.getJSONObject(i);
    ansTable = c.getString(TAG_ANSWER_TABLE);
    System.out.println("TABLE: " + ansTable);

    //test if there is "0" or an array

    JSONArray arr = c.getJSONArray(TAG_ANSWER_TABLE); ****ERROR HERE****
    System.out.println("ARRAY: " + String.valueOf(arr));

    for (int j = 0; j <arr.length();j++){
        JSONArray child = arr.getJSONArray(j);
        JSONObject d = child.getJSONObject(0);
        String col = d.getString(TAG_ANSWER_TABLE_COLID);
        String val = d.getString(TAG_ANSWER_TABLE_VALUE);
        System.out.println("DATA: " + col +": "+val);
        System.out.println("CHILD: " + String.valueOf(child));
        System.out.println("INNER: " + String.valueOf(d));
    }

Приведенный выше фрагмент кода правильно анализирует первую table_data, но выдает ошибку type org.json.JSONObject cannot be converted to JSONArray, как указано в приведенном выше фрагменте кода.

Как мне правильно разобрать 0, 1, 2 и т.д.? Я знаю, что это объекты, но я не уверен, как я буду проверять их появление. Любая помощь будет принята с благодарностью. Спасибо


person mhorgan    schedule 14.09.2015    source источник
comment
посмотрите, помогает ли это   -  person Blackbelt    schedule 14.09.2015


Ответы (2)


Структура данных противоречива, 2-я часть ниже - это не массив, а объект, но первая table_data - это массив

       "table_data": {
            "0": [
                {
                    "column_id": 61,
                    "value": "1091"
                },
                {
                    "column_id": 62,
                    "value": "2046"
                }
            ],
            "1": [
                {
                    "column_id": 61,
                    "value": "467"
                },
                {
                    "column_id": 62,
                    "value": "1429"
                }
            ],
            "2": [
                {
                    "column_id": 61,
                    "value": "1236"
                },
                {
                    "column_id": 62,
                    "value": "2202"
                }
            ]
        }

Изменить:

JSONArray arr = c.optJSONArray(TAG_ANSWER_TABLE);
if (arr!=null) {
   //parse as array
} else {
    //you may use c.getJSONObject(TAG_ANSWER_TABLE); as well, if it MUST be either array or object
    JSONObject obj = c.optJSONObject(TAG_ANSWER_TABLE); 
   //parse as obj

}
person Derek Fung    schedule 14.09.2015
comment
Есть ли способ разобрать оба? Или мне нужно, чтобы оба были либо массивом/объектом? - person mhorgan; 14.09.2015
comment
JSONArray arr = c.optJSONArray(TAG_ANSWER_TABLE); вы должны использовать это, а затем проверить, является ли arr нулевым, если оно равно нулю, вы проверяете JSONObject obj = c.optJSONObject(TAG_ANSWER_TABLE);, чтобы получить и проанализировать его как объект - person Derek Fung; 14.09.2015
comment
Это полезно. Пару минут назад я узнал, что opt в этом случае лучше, поскольку возвращает null, если объект не существует. - person mhorgan; 14.09.2015
comment
Да. Я обновил свой ответ, чтобы включить это - person Derek Fung; 14.09.2015

person    schedule
comment
Это разборчиво еще нет? Можно я просто: JSONObject obj = c.optJSONObject(TAG_ANSWER_TABLE); if (obj == null) { //parse array} else {//parse object} - person mhorgan; 14.09.2015