#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) {
...
}
Спасибо за ваши комментарии, ребята.