2015-03-10 2 views
0

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

[ 
    { 
     "iso": "AF", 
     "tel": "93" 
    }, 
    { 
     "iso": "AL", 
     "tel": "355" 
    }, 
    { 
     "iso": "DZ", 
     "tel": "213" 
    } 
] 

Я получаю пользователя iso и в соответствии с данными в файле формата JSON необходимо извлечь код страны (очевидно, tel).

Метод, который возвращает строку из файла JSON:

private String loadJson(){ 
     String json; 
     try{ 
      InputStream inputStream = getAssets().open("countries.json"); 
      int size = inputStream.available(); 
      byte[] buffer = new byte[size]; 
      inputStream.read(buffer); 
      inputStream.close(); 
      json = new String(buffer,"UTF-8"); 


     }catch (IOException e){ 
      e.printStackTrace(); 
      return null; 
     } 
     return json; 
    } 

Это получает пользователя код ISO:

TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); 
     String countryCode = tm.getSimCountryIso(); 
     Log.i("Country Code: ", countryCode); //"AF" for example 

И это то, что я сделал до сих пор, что, очевидно, не работает, как я нужно:

try{ // doesnt work 
      JSONArray arr; 
      JSONObject jsonObj = new JSONObject(loadJson()); 

      arr = new JSONArray(jsonObj); 
      for(int i=0; i < arr.length() ; i++){ 
       JSONObject test = arr.getJSONObject(i); 
       if(test.getString("iso")==countryCode) 
       Log.d("TEL: ", test.getString("tel")); 
      } 
     }catch (JSONException e){ 
      e.printStackTrace(); 
     } 
    } 

в довершение всего, я получаю предупреждение о Call requires API level 19 (current min is 16): org.json.JSONArray, поэтому я думаю, мне нужно обходное решение для извлечения необходимых мне данных (мое решение не работает) и по-прежнему поддерживает более низкие версии Android.

+0

причина для предупреждения, похоже, что-то другое, чем то, о чем вы упоминали. AS org.json.JSONArray был добавлен в API уровня 1. Вот ссылка на документацию. developer.android.com/reference/org/json/JSONArray.html – cafebabe1991

+0

Мой плохой ... Да, предупреждение связано с тем, что конструктор JSONArray (Object) принадлежит к уровню API 19. – cafebabe1991

ответ

0

В вашем menifest файле заменить

android:minSdkVersion="16" 

с

android:minSdkVersion="19" 
+0

Невозможно поддерживать более низкие версии android также. – undroid

1

Строка вы возвращаете из метода загрузки JSon является JsonArray не JsonObject.

Изменение от

JSONArray arr; 
     JSONObject jsonObj = new JSONObject(loadJson()); 

     arr = new JSONArray(jsonObj); 

Для этого

JSONArray arr; 
      arr = new JSONArray(loadJson()); 

Для предупреждения

Измените мин версии SDK в вашем файле манифеста, как этот

android:minSdkVersion="19" 

или применять Подавить предупреждения в вашем методе loadJson

чтения here

+0

Этот ответ правильный. Если вы измените конструктор JSONArray, чтобы взять строку, предупреждение о minSDK также исчезнет. В настоящее время это происходит потому, что конструктор, который вы используете, это конструктор JSONArray (Object), который находится в SDK 19 в соответствии с [docs.] (Http://developer.android.com/reference/org/json/JSONArray.html #JSONArray (java.lang.Object)) –

0

Ваш результат приходит от сервера в виде jsonArray но вы пытаетесь преобразовать, чтобы jsonObject. Ниже то, что вы пытаетесь сделать: -

mJSONObject = new JSONObject(loadJson()); 

Но вы должны сделать это: -

mJSONArray = new JSONArray(loadJson()); 

И самое главное, не JSONArray(Object array) не был введен до уровня API 19.

Read here

Вы можете изменить свою мин API версии в вашем manifest быть 19 или

вы можете конвертировать ваши Object array в Collection array как ArrayList и использовать конструктор массива Коллекции JSONArray, который доступен от API 1.

Смежные вопросы