Как разобрать 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, т.е. "[]{ },".
Мое решение делает некоторые предположения:
Вы используете двойные кавычки в json.
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);