Повторение / анализ этого ответа JSON

#java #android #arrays #json

#java #Android #массивы #json

Вопрос:

В моем приложении есть несколько каналов JSON, которые анализируются правильно, используя правильную грамматику и использование ключей. Я использую методологию, аналогичную следующей:

 try {

    JSONObject jsonObj = new JSONObject(response);
    if(jsonObj.length() > 0){
        Iterator keys = jsonObj.keys();
        while (keys.hasNext()) {
            String key = (String) keys.next();
            JSONObject obj = (JSONObject) jsonObj.get(key);

            String myString = obj.get("fieldname").toString();

            ...
        }
    }
} catch(e) {
    ...
}
  

Однако один из имеющихся у меня каналов JSON оформлен следующим образом, который необходимо проанализировать немного по-другому:

 {
"10":["111","aaa","bbb","213sdg","1.0","-0.343"],
"20":["111","aaa","bbb","213sdg","1.0","-0.343"],
"30":["111","aaa","bbb","213sdg","1.0","-0.343"],
"40":["111","aaa","bbb","213sdg","1.0","-0.343"],
"50":["111","aaa","bbb","213sdg","1.0","-0.343"]
}
  

Я пытался использовать JSONArray вместо JSONObject , но все же предложение try{} выдает ошибку за требование имени поля / ключа, когда в фиде нет имен полей / ключей.

Есть ли простой способ повторить этот канал стилей без необходимости изменять вывод канала? Большое спасибо

РЕДАКТИРОВАТЬ: изменены ключи объектов JSON, чтобы показать, что я на самом деле использую разные числа

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

1. У вас есть только один JSONObject в вашем json. Почему вы используете второй JSONObject в вашем цикле while?

2. Этот код не применяется к JSON, который я опубликовал. Второй объект должен был получить JSONObject «строки», чтобы затем проанализировать и получить значение поля этой строки.

3. в вашей строке нет никакого jsonobject. ваш массив просто содержит строки

4. Хорошо, итак, вернемся к моему сообщению, как мне изменить код, чтобы теперь проанализировать этот новый канал? Является ли каждая строка теперь просто массивом строк?

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

Ответ №1:

Попробуйте этот код

 try{
  JSONObject jObject = new JSONObject(yourStringFromYourQuestion);

  // To get one specific element:
  JSONObject w1 = jObject.getJSONObject("10");
  JSONObject w2 = jObject.getJSONObject("20");

  // Iterate over all elements
  Iterator<?> keys = jObject.keys();
  while( keys.hasNext() ) {
  String key = (String)keys.next(); // "10", etc
  if ( jObject.get(key) instanceof JSONObject ) {

   try {
  // jsonString is a string variable that holds the JSON 
   JSONArray itemArray=jObject.getJSONArray(key);
   for (int i = 0; i < itemArray.length(); i  ) {
     int value=itemArray.getInt(i);
     Log.e("json", i "=" value);
    }
   } catch (JSONException e) {
   // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
 } catch (JSONException e){
  Log.e(LOG_TAG, "Failure converting JSON String", e);
  }
  

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

1. Спасибо за ответ. Однако вы String score = entry.optString("score", ""); полагаетесь на то, что JSON имеет поля, сопоставленные с ключами, например "score":"123","alive":"yes",etc . У меня нет такого сопоставления с ключами

2. Спасибо. Да, это имеет смысл. Поскольку это довольно большая загрузка JSON, для минимизации времени загрузки имена полей были опущены. Итак, ключи исчезли. Тогда мой исходный код не может быть проанализирован с помощью объекта JSONArray?

3. Я упомянул, что я не хочу менять канал и что я хочу проанализировать канал без ключей, если это возможно

Ответ №2:

Хорошо, было проще, чем я думал. Просто обратитесь к каждой «строке» как к JSONArray и проанализируйте, используя индексы столбцов:

 try {

    JSONObject jsonObj = new JSONObject(response);
    if(jsonObj.length() > 0){
        Iterator keys = jsonObj.keys();
        while (keys.hasNext()) {
            String key = (String) keys.next();
            JSONArray rowArr = jsonObj.getJSONArray(key);

            String fieldone = rowArr.getString(0);
            String fieldtwo = rowArr.getString(1);           

            ...
        }
    }
} catch(e) {
    ...
}
  

Спасибо за ваши комментарии, ребята.