Синтаксический анализ массива JSON внутри объекта JSON

#java #json #parsing

#java #json #синтаксический анализ

Вопрос:

У меня есть некоторый JSON со следующей структурой:

 {"source":[
           {"name":"john","age":20},
           {"name":"michael","age":25},
           {"name":"sara", "age":23}
         ]
}
  

Я назвал эту строку JSON как mainJSON . Я пытаюсь получить доступ к элементам «name» и «age» с помощью следующего Java-кода:

 JSONArray jsonMainArr = new JSONArray(mainJSON.getJSONArray("source"));
for (int i = 0; i < jsonMainArr.length(); i  ) {  // **line 2**
     JSONObject childJSONObject = jsonMainArr.getJSONObject(i);
     String name = childJSONObject.getString("name");
     int age     = childJSONObject.getInt("age");
}
  

Мне показывают следующее исключение для строки номер 2:

 org.json.JSONException: JSONArray initial value should be a string or collection or array.
  

Пожалуйста, подскажите мне, где я допускаю ошибку и как это исправить.

Комментарии:

1. В вашем исходном коде нет проблем, я уже пробовал это.

Ответ №1:

mainJSON.getJSONArray("source") возвращает JSONArray , следовательно, вы можете удалить new JSONArray.

Конструктор JSONArray с параметром object ожидает, что это будет коллекция или массив (не JSONArray)

Попробуйте это:

 JSONArray jsonMainArr = mainJSON.getJSONArray("source"); 
  

Комментарии:

1. Как мы можем проанализировать JSON подобным образом? [{«id»: «1», «name»:»ABC»},{«id»:»2″,»name»:»XYZ»}]

2. Это может помочь json = «{«m»=» json «}»; а теперь выполните синтаксический анализ по имени ‘m’.

Ответ №2:

Ваш код в порядке, просто замените следующую строку:

 JSONArray jsonMainArr = new JSONArray(mainJSON.getJSONArray("source"));
  

с помощью этой строки:

 JSONArray jsonMainArr = mainJSON.getJSONArray("source");
  

Комментарии:

1. Что, если полученный формат данных [{dict1},{dict2},{dict3}]?

2. Список JSONArray = новый JSONArray(jsonString);

Ответ №3:

строка 2 должна быть

 for (int i = 0; i < jsonMainArr.size(); i  ) {  // **line 2**
  

Для строки 3 мне приходится делать

     JSONObject childJSONObject = (JSONObject) new JSONParser().parse(jsonMainArr.get(i).toString());
  

Ответ №4:

 private static String readAll(Reader rd) throws IOException {
    StringBuilder sb = new StringBuilder();
    int cp;
    while ((cp = rd.read()) != -1) {
      sb.append((char) cp);
    }
    return sb.toString();
  }

 String jsonText = readAll(inputofyourjsonstream);
 JSONObject json = new JSONObject(jsonText);
 JSONArray arr = json.getJSONArray("sources");
  

Ваш arr будет выглядеть следующим образом: [
{
«id»: 1001,
«имя»: «jhon»
},
{
«id»: 1002,
«имя»: «jhon»
}
]
Вы можете использовать:

 arr.getJSONObject(index)
  

чтобы получить объекты внутри массива.

Ответ №5:

Это может быть ответом на ваш вопрос:

 JSONArray msg1 = (JSONArray) json.get("source");
for(int i = 0; i < msg1.length(); i  ){
  String name = msg1.getString("name");
  int age     = msg1.getInt("age");
}
  

Комментарии:

1. Не могли бы вы, пожалуйста, подробнее изложить свой ответ, добавив немного больше описания предоставляемого вами решения?

2. не работает — нет ссылки на «i» при повторении

3. Не удается преобразовать строку в JSONArray, это не работает