我收到以下错误:
org.json.JSONException:类型为java.lang.Byte的0的值91无法转换为JSONObject
这是因为这行代码:
JSONObject jObj = j.getJSONObject(i);
我正在执行GET
请求,并将其记录在Android Studio中,如下所示:
jsonarray [91,109,111,100,101,108,46,83,116,111,114,101,64,52,57,57,54,102,97,56,44,32,109,111,100,101,108
在浏览器中,它看起来像这样:
链接到屏幕截图:http://i.imgur.com/NTpwbuB.png
我曾使用过JSONObject
,因为我想稍后这样做:
String storeName = jObj.getString("STORE NAME");
String street = jObj.getString("STREET");
String city = jObj.getString("CITY");
以下是代码:
public void getSubprises() {
Call<List<Store>> call = subpriseAPI.listStores();
call.enqueue(new Callback<List<Store>>() {
@TargetApi(Build.VERSION_CODES.KITKAT)
@Override
public void onResponse(Response<List<Store>> response, Retrofit retrofit) {
try {
JSONArray j = new JSONArray(response.body().toString().getBytes());
System.out.println("jsonarray "+ j);
for (int i = 0; i < j.length(); i++) {
JSONObject jObj = j.getJSONObject(i);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Throwable t) {
}
});
}
答案 0 :(得分:1)
只需更改
JSONArray j = new JSONArray(response.body().toString().getBytes());
到
JSONArray j = new JSONArray(response.body().toString());
我认为这就是你想要做的。 如果这不起作用,那么你真的不知道响应体内部有什么,学习使用System.out.print函数来查看什么是response.body()。toString()打印。
如果它像
那样[ {“STORE_NAME”:“abc”,“STREET”:“def”},{“STORE_NAME”:“asw”,“STREET”:“rew”} ]
一切都很顺利。否则你需要改变你获得jsonobject的方式。编辑:
[“model.Store@4996fa8”,“model.Store@949eac1”,“model.Store@c45f266”,...
你在评论中写的这个输出让我意识到你不需要JSONArray或任何东西,Response&gt;响应已经有了Store对象。
查看该输出,response.body()返回List,
然后你可以这样做来获得输出
编辑2:
java.util.Iterator it=response.body().iterator();
while(it.hasNext())
System.out.println(((Store)it.next()).getStreet());
以上代码仅在Store对象具有getStreet方法时才有效,如果不是,您可以使用st.street或st。然后按ctrl + space并在那里找到像街道一样的街道。