在我的应用程序中,我有一个以下格式的本地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 :(得分:1)
您从加载json方法返回的字符串是JsonArray
而不是JsonObject
。
从
改变JSONArray arr;
JSONObject jsonObj = new JSONObject(loadJson());
arr = new JSONArray(jsonObj);
到此
JSONArray arr;
arr = new JSONArray(loadJson());
警告
更改清单文件中的min sdk版本,如下所示
android:minSdkVersion="19"
或在方法loadJson
阅读here
答案 1 :(得分:0)
在您的清单文件中替换
android:minSdkVersion="16"
与
android:minSdkVersion="19"
答案 2 :(得分:0)
您的结果来自jsonArray
形式的服务器,但您尝试转换为jsonObject
。以下是您要做的事情: -
mJSONObject = new JSONObject(loadJson());
但你应该这样做: -
mJSONArray = new JSONArray(loadJson());
最重要的是JSONArray(Object array)
直到 API级别19 才会被引入。
您可以将manifest
中的min API 版本更改为19或
您可以将Object array
转换为Collection array
ArrayList
,并使用{strong> API 1 中提供的JSONArray
的Collection数组构造函数。