2013-03-13 144 views
0

我对Android开发比较陌生,正在编写我的第一个基于REST的应用程序。我选择使用Android Asynchronous HTTP Client使事情变得更简单。我目前只是通过该链接的主要“推荐用法”部分,本质上只是创建一个基本的静态HTTP客户端。我遵循给定的代码,但改变它来引用不同的API。这里是有问题的代码:类型不匹配:无法从Object转换为JSONObject

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中抛出一个错误:“类型不匹配:不能从对象转换为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); 

     } 
+0

请问您可以粘贴您通过获取请求检索的场地价值吗? – 2013-03-13 05:48:31

+0

使用GSON从谷歌,因为它很容易,快速,重量轻,并采取了所有的痛苦,这离开https://code.google.com/p/google-gson/ – 2013-06-17 22:05:36

回答

0

是的,你应该用getJSONObject,以确保您获得的值是一个JSON对象。是的,你应该抓住可能的JSONException如果该数组中的索引不存在或者不包含对象,则抛出该数据。

它会是这个样子:

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

谢谢。那么第1行的错误处理没有帮助呢?可以删除吗? ''FactualRestClient.get()'被定义为:public static void get(String url,RequestParams params,AsyncHttpResponseHandler responseHandler){client.get(getAbsoluteUrl(url),params,responseHandler); \t}'因此它已经内置错误处理...你能澄清吗? – user2163853 2013-03-13 05:38:57

+0

您现有的'throws'子句捕获'getFactualResults'方法中抛出的'JSONException's,但在响应处理程序的'onSuccess'方法中会发生异常。所以这种方法必须抛出异常(这将需要修改接口和'FactualRestClient')。即便如此,因为这是异步的,所以你不能在getFactualResults的运行时间内抛出它。最好在'onSuccess'中捕获它,或者如果它真的出乎意料,就抛出一个'RuntimeException'(这是未选中的)。 – 2013-03-13 05:59:19

+0

OK,所以我这样做了,但后来遇到了在try/catch块内初始化firstVenue和venueName的问题 - 错误是“局部变量fi​​rstVenue可能未被初始化”。即使我在try/catch之前初始化,它仍然会发生。思考? – user2163853 2013-03-14 03:38:09

1

你可以尝试转换对象,你都可以从查询到字符串,然后使用

最终的JSONObject的JSONObject =新的JSONObject(stringresult);

我以前得到同样的错误,它为我工作。

+0

对不起,你能澄清一下如何适合现有的代码吗?谢谢 – user2163853 2013-03-13 05:43:16

+0

你得到的场地的价值是什么? – 2013-03-13 07:19:14

+0

我不确定你的意思 - 场地在JSONArray中返回并且是JSONObjects。 – user2163853 2013-03-13 13:34:56

0

转换OBJ到JSON对象:

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

0

由Shail Adi提供的解决方案只能通过将firstVenue和venueName的初始值设置为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); 
相关问题