【问题标题】:Type mismatch: cannot convert from Object to JSONObject类型不匹配:无法从 Object 转换为 JSONObject
【发布时间】:2013-03-13 05:15:43
【问题描述】:

我对 Android 开发比较陌生,正在编写我的第一个基于 REST 的应用程序。我选择使用Android Asynchronous HTTP Client 让事情变得更容易一些。我目前正在浏览该链接上的主要“推荐用法”部分,基本上只是创建一个基本的静态 HTTP 客户端。我正在遵循给出的代码,但将其更改为引用不同的 API。这是有问题的代码:

    public void getFactualResults() throws JSONException {
    FactualRestClient.get("q=Coffee,Los Angeles", null, new JsonHttpResponseHandler() {
        @Override
        public void onSuccess(JSONArray venues) {
            // Pull out the first restaurant from the returned search results
            JSONObject firstVenue = venues.get(0);
            String venueName = firstVenue.getString("name");

            // Do something with the response
            System.out.println(venueName);

        }
    });
}

String venueName = firstVenue.getString("name"); 行当前在 Eclipse 中引发错误:“类型不匹配:无法从 Object 转换为 JSONObject”。为什么会出现这个错误?我搜索了其他线程,导致我尝试使用getJSONObject(0) 而不是get(0),但这导致了进一步的错误,Eclipse 建议使用 try/catch。我没有更改教程中的任何代码,除了变量名和 URL。有什么想法/提示/建议?

非常感谢。

编辑:

这里是 onSuccess 方法,修改为包含建议的 try/catch 块。 Eclipse 现在在此处显示 firstVenue 的“局部变量可能尚未初始化”:venueName = firstVenue.getString("name"); 和此处的场地名称:System.out.println(venueName); 即使我在 JSONObject firstVenue; 之后直接初始化 String venueName; 我仍然得到相同的错误。任何解决这些问题的帮助将不胜感激!

public void onSuccess(JSONArray venues) {
            // Pull out the first restaurant from the returned search results
            JSONObject firstVenue;
            try {
                firstVenue = venues.getJSONObject(0);
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            String venueName;
            try {
                venueName = firstVenue.getString("name");
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            // Do something with the response
            System.out.println(venueName);

        }

【问题讨论】:

  • 能否粘贴您通过获取请求检索到的场所值?
  • 使用来自 google 的 GSON,因为它简单、快速、重量轻,可以消除所有痛苦code.google.com/p/google-gson

标签: android json


【解决方案1】:

您可以尝试将您从查询中获得的对象转换为字符串,然后使用

最终的 JSONObject jsonObject = new JSONObject(stringresult);

我之前遇到了同样的错误,它对我有用。

【讨论】:

  • 抱歉,您能说明一下它如何适合现有代码吗?谢谢
  • 你得到的场地价值是什么?
  • 我不确定您的意思 - 场地以 JSONArray 形式返回,并且是 JSONObjects。
【解决方案2】:

是的,您应该使用getJSONObject 来确保您获得的值是一个JSON 对象。是的,如果数组中的索引不存在或不包含对象,您应该捕获可能抛出的 JSONException

它看起来像这样:

JSONObject firstVenue;
try {
    firstVenue = venues.get(0);
} catch (JSONException e) {
    // error handling
}

【讨论】:

  • 谢谢。那么第 1 行中的错误处理没有帮助吗?可以直接删除吗? FactualRestClient.get() 被定义为:public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) { client.get(getAbsoluteUrl(url), params, responseHandler); } 所以它已经内置了错误处理......你能澄清一下吗?
  • 您现有的throws 子句会捕获JSONExceptions,它们在getFactualResults 方法中抛出,但在响应处理程序的onSuccess 方法中会发生异常。因此该方法必须抛出异常(这将需要修改接口和FactualRestClient)。即便如此,因为这是异步的,所以你不能在getFactualResults 的运行时内抛出它。最好在 onSuccess 中捕获它,或者如果它真的出乎意料,请抛出 RuntimeException(未选中)。
  • 好的,所以我这样做了,但后来我遇到了在 try/catch 块中初始化 firstVenue 和 placeName 的问题 - 错误是“局部变量 firstVenue 可能尚未初始化”。即使我在 try/catch 之前都初始化了,它仍然会发生。想法?
  • 你必须粘贴修改后的代码片段让我告诉。
  • jeremy,我在原始问题正文的底部添加了修改后的代码片段,因为我想让它尽可能可读。
【解决方案3】:

将obj转换为json对象:

对象 obj = JSONValue.parse(inputParam); JSONObject jsonObject = (JSONObject) obj;

【讨论】:

    【解决方案4】:

    Shail Adi 提供的解决方案仅对我有效,方法是将 firstVenue 和 placeName 的初始值设置为 null。这是我的代码:

            JSONObject firstVenue = null;
            try {
                firstVenue = (JSONObject)venues.get(0);
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            String venueName = null;
            try {
                venueName = firstVenue.getString("name");
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            // Do something with the response
            System.out.println(venueName);
    

    【讨论】:

      猜你喜欢
      • 2014-04-07
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多