Как разобрать JSON и превратить его значения в массив?

public static void parseProfilesJson(String the_json){
       try {
            JSONObject myjson = new JSONObject(the_json);

            JSONArray nameArray = myjson.names();
            JSONArray valArray = myjson.toJSONArray(nameArray);
            for(int i=0;i<valArray.length();i++)
            {
                String p = nameArray.getString(i) + "," + ValArray.getString(i);
                Log.i("p",p);
            }       

        } catch (JSONException e) {
                e.printStackTrace();
        }
    }

Как вы можете видеть, этот пример кода выведет KEY of JSONs, а затем VALUES of JSONS.

Джон бы напечатал профили, если бы json был таким:

{'profiles':'john'}

Это круто. Это нормально, так как я могу работать с этими переменными. Однако, что если JSON был таким:

{'profiles': [{'name':'john', 'age': 44}, {'name':'Alex','age':11}]}

В этом случае все значение будет массивом. По сути, я просто хочу получить этот массив (который в данном случае является "значением")... и превратить его в реальный массив, который может использовать JAVA. Как я могу это сделать? Благодарю.

3 ответа

Решение

Для вашего примера:

{'profiles': [{'name':'john', 'age': 44}, {'name':'Alex','age':11}]}

вам придется сделать что-то из этого эффекта:

JSONObject myjson = new JSONObject(the_json);
JSONArray the_json_array = myjson.getJSONArray("profiles");

это возвращает объект массива.

Тогда итерация будет выглядеть следующим образом:

    int size = the_json_array.length();
    ArrayList<JSONObject> arrays = new ArrayList<JSONObject>();
    for (int i = 0; i < size; i++) {
        JSONObject another_json_object = the_json_array.getJSONObject(i);
            //Blah blah blah...
            arrays.add(another_json_object);
    }

//Finally
JSONObject[] jsons = new JSONObject[arrays.size()];
arrays.toArray(jsons);

//The end...

Вы должны будете определить, являются ли данные массивом (просто проверяя, что charAt(0) начинается с [ персонаж).

Надеюсь это поможет.

Другие ответы на этот вопрос предполагают, что у вас есть объект Java для работы. Я хотел иметь возможность получать значения из произвольной структуры json, для которой у меня не обязательно был соответствующий объект Java.

Моя идея - это ключи полей в форме "ключ": значение". Теперь каждая строка результата содержит до одного значения, которое можно поместить в список/массив. Я также удаляю разделители области видимости json, т.е. "[]{ },".

Мое решение делает некоторые предположения:

  1. Вы используете двойные кавычки в json.

  2. JSON довольно отформатирован.

            public static String getOnlyJsonValues(String json) {
        json = json.replaceAll("\\{", "");
        json = json.replaceAll("}", "");
        json = json.replaceAll("\\[", "");
        json = json.replaceAll("]", "");
        json = json.replaceAll("\".*?\":", "");
        return json;
    }
    

Теперь вам просто нужно разобрать вывод в список строк:

          public static List<String> parseUniqueValues(String json) {
        List<String> values = new ArrayList<>();
        String onlyValues = getOnlyJsonValues(json);

        try {
            StringReader stringReader = new StringReader(onlyValues);
            BufferedReader bufReader = new BufferedReader(stringReader);
            String line;
            while ((line = bufReader.readLine()) != null) {
                if (line.endsWith(",")) {
                    line = line.substring(0, line.length() - 1);
                }
                if (line.startsWith("\"") && line.endsWith("\"")) {
                    line = line.substring(1, line.length() - 1);
                }


                line = line.trim();
                if (line.length() > 0) {
                    values.add(line);
                }
                
            }
        } catch (IOException e) {
            LOG.warn("Unable to read lines in String:" + onlyValues);
        }

        return values;
    }

Вы можете предпочесть быстрый парсер json, чтобы удовлетворить ваши требования...

Парсер quick-json очень простой, гибкий, очень быстрый и настраиваемый. Попробуйте это

[анализатор quick-json] ( https://code.google.com/p/quick-json/) - функции quick-json -

  • Соответствует спецификации JSON (RFC4627)

  • Высокопроизводительный анализатор JSON

  • Поддерживает гибкий / настраиваемый подход к анализу

  • Настраиваемая проверка пар ключ / значение любой иерархии JSON

  • Простота в использовании

  • Повышает дружественный к разработчику и легко отслеживать исключения

  • Поддержка сменной настраиваемой проверки - ключи / значения можно проверять, настраивая настраиваемые средства проверки по мере их появления.

  • Поддержка валидации и недействительности парсера

  • Поддержка двух типов конфигурации (JSON/XML) для использования парсера для быстрой проверки json

  • Требуется JDK 1.5 # Нет зависимости от внешних библиотек

  • Поддержка Json Generation через сериализацию объектов

  • Поддержка выбора типа коллекции во время анализа

Например,

JsonParserFactory factory=JsonParserFactory.getInstance();
JSONParser parser=factory.newJsonParser();
Map jsonMap=parser.parseJson(jsonString);
Другие вопросы по тегам