2015-09-08 4 views
0

Я пытаюсь разобрать строку JSON в Android, которая динамична. Это очень простая структура JSON. Аналогичные изменения:Отсутствующие ключи в формате JSON

{ 
    "a": 1, 
    "b": 2, 
    "c": 3, 
    "d": 4, 
    "e": 5 
}  

Но иногда я не получаю ключи. Например, ключ «b» может отсутствовать. Затем мой код генерирует исключение JSONParser. И дальнейшая строка JSON не могла анализироваться.

Так можно ли игнорировать недостающие ключи? Я пробовал optString();, но это работает только в случае String, что о JSONObject и JSONArray? optJSONArray() и optJSONObject() не работает.

Есть идеи или решения?

+2

«optJSONArray() и optJSONObject() не работает "- что именно не работает? Пожалуйста, будьте более конкретными. – Egor

+0

, если я попытался получить значение соответствующих JSONObject и JSONParser из отсутствующих ключей, тогда getJSONArray («ключ») и getJSONObject («ключ») возвращают исключение. Я использовал optJSONArray («ключ») и optJSONObject («ключ»), но проблема все еще сохраняется –

ответ

1

Я думаю, что самый простой способ - использовать GSON!

Вы просто создаете простой старый объект Java (POJO), представляющий нужные вам данные, и пусть GSON сделает все остальное. Если значение не существует в json-строке, оно будет установлено в значение «по умолчанию» для этого типа (обычно оно равно нулю, но равно 0 для int, false для булевых и т. Д.)

Включить в ваш проект Android Студия:

compile 'com.google.code.gson:gson:2.2.4' 

Также посмотрите на this page, обращая особое внимание на «Примеры объектов» заголовок для того, как использовать GSON.

0

Вы можете найти динамический ключ, используя Белу

String jsonString = "{ \"a\": 1, \"b\": 2, \"c\": 3, \"d\": 4, \"e\": 5 }"; 



try { 
     JSONObject jsonObject = new JSONObject(jsonString); 
     JSONObject issueObj = new JSONObject(jsonString); 
     Iterator iterator = issueObj.keys(); 
     while(iterator.hasNext()){ 
      String key = (String)iterator.next(); 

      Integer value = (Integer) issueObj.get(key); 
      Log.d(TAG,"value: "+value); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

Или вы можете использовать GSON.

0

Вы можете попробовать преобразовать что JSONObject к карте с помощью GSON, как следующее:

 String json1 = "{\n" + 
       " \"a\": 1,\n" + 
       " \"b\": 2,\n" + 
       " \"c\": 3,\n" + 
       " \"d\": 4,\n" + 
       " \"e\": 5\n" + 
       "}"; 
     Gson gson1 = new Gson(); 
     Type type1 = new TypeToken<Map<String, Integer>>(){}.getType(); 
     Map<String, Integer> myMap1 = gson1.fromJson(json1, type1); 

В вашем build.gradle файл:

compile 'com.google.code.gson:gson:2.3.1' 
Смежные вопросы