【问题标题】:Value 91 at 0 of type java.lang.Byte cannot be converted to JSONObjectjava.lang.Byte 类型为 0 的值 91 无法转换为 JSONObject
【发布时间】:2016-03-23 01:39:58
【问题描述】:

我收到以下错误:

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) {

        }
    });
}

【问题讨论】:

  • 为什么你认为你JSONArray中的数字JSON值91可以转换成JSONObject
  • 你不能得到91的街道。你不需要把jsonobjects放在jsonarray里面吗?您还将字节放入 jsonarray 构造函数中。把你想要的字符串作为一个 jsonarray

标签: java android retrofit


【解决方案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", ...

你在 cmets 中写的这个输出让我意识到你不需要 JSONArray 或任何东西,Response> 响应已经有 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 并在此处找到类似标签的街道。

【讨论】:

  • 我正在使用这个String body = new String( response.body().toString().getBytes()); 并且输出显示我:body [model.Store@4996fa8, model.Store@949eac1, model.Store@c45f266, model.Store@a8779a7, model.Store@e9de54, model.Store@e4971fd, 所以我很接近,但我仍然不知道如何修复它..
  • 你的东西也给了我这个作为输出:["model.Store@4996fa8","model.Store@949eac1","model.Store@c45f266",
  • 这里是:JSONArray j = new JSONArray(response.body().toString());
  • 伙计,你真的在​​误导我们。 :) 我想帮忙 :) Response> 响应,如您所见,响应包含存储对象的列表。您不需要 JSONArray。此响应是您编写的自定义类?您需要在响应中获取 List 对象,不需要 jsonarray。
  • 对我的回答的最后一次编辑肯定会解决您的问题。检查更新的答案(除了包含 ["model.Store@4996fa8","model.Store@949eac1","model.Store@c45f266" 的那个之外,你能删除 cmets 吗),
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多