2012-07-18 101 views
1

我想解析Android中的Google Places JSON數據。我知道我傳遞的URL(但是我把我的密鑰從下面的代碼中取出)。我可以將JSON數據顯示在TextView中,但現在我想分析它並獲取(此時)要顯示的第一個項目的名稱。我修改了一個解析Twitter feed的教程,並且twittwr教程正確顯示,但我的修改後的代碼不顯示任何內容。它不會崩潰,並且我不會有任何錯誤,所以我不知道什麼是錯的。所以這是我的代碼:在Android中解析Google Places JSON數據?

public class GetPort extends Activity { 

TextView showJSdata; 
HttpClient client; 
JSONObject json; 

final static String pURL = "https://maps.googleapis.com/maps/api/place/search/json? location=30.487263,-97.970799&radius=25000&types=airport&sensor=false&key=MY_KEY"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.mn_test3); 
    showJSdata = (TextView)findViewById(R.id.http_tv); 
    client = new DefaultHttpClient(); 
    new ReadURL().execute("name"); 
} 

public JSONObject showPorts() 
throws ClientProtocolException, IOException, JSONException{ 

    StringBuilder portURL = new StringBuilder(pURL);   
    HttpGet get = new HttpGet(portURL.toString()); 
    HttpResponse r = client.execute(get); 
    int status = r.getStatusLine().getStatusCode(); 
    if(status == 200){ 
     HttpEntity e = r.getEntity(); 
     String data = EntityUtils.toString(e); 
     JSONArray timeline = new JSONArray(data); 
     JSONObject lastport = timeline.getJSONObject(0); 
     return lastport; 
    }else{ 
     Toast.makeText(GetPort.this, "oops", Toast.LENGTH_SHORT); 
     return null; 
    } 

} 

public class ReadURL extends AsyncTask<String, Integer, String>{ 

    @Override 
    protected void onPostExecute(String result) { 
     showJSdata.setText(result); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     try { 
      json = showPorts(); 
      return json.getString(params[0]); 
     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


     return null; 
    } 

} 

} 

任何人都可以看到代碼失敗的地方,或者我錯了哪裏?

+0

首先,你確定你的應用程序到達解析JSON的行嗎?嘗試添加一個Log.d()在那裏,看看。我現在要過去了,這只是爲了安全 – 2012-07-18 20:49:07

回答

3

好吧,我改變你的代碼了一下,得到如下結果:

Cedar Park Regional Medical Center 

如果這就是它想給的代碼是這樣的:

if(status == 200){ 
    HttpEntity e = r.getEntity(); 
    String data = EntityUtils.toString(e); 
    JSONObject jsonObject = new JSONObject(data); 
    JSONArray timeline = jsonObject.getJSONArray("results"); 
    JSONObject lastport = timeline.getJSONObject(0); 
    return lastport; 
} 

您可以通過將其粘貼到瀏覽器的地址欄來查看整個輸出。 也注意到你在URL中的json?部分之後有一個空格。 您需要首先從數據創建一個對象,然後解析它。將數組名稱設爲results 然後獲取其中的任何對象,並取其字符串。

而且,當我跑你的代碼(我的API密鑰)我沒有得到錯誤,而不是致命錯誤,崩潰您的應用程序,但錯誤解析JSON(出現在橙在logcat中)

+0

非常感謝你拉喇叭!有用!所以如果我正確解釋你的解決方案,你必須將「數據」字符串傳遞給JSONObject,然後將JSONArray應用於新的JSONObject ...對吧?我沒有創建一個新的JSONObject,我只是將「數據」字符串傳遞給JSONArray。 – kirktoon1882 2012-07-18 21:50:29

+0

順便說一句,當我將我的代碼粘貼到這篇文章中時,URL中的空間發生了。這不在我的活動代碼中。 – kirktoon1882 2012-07-18 21:51:27

+0

是的,你是對的。你從接收到的字符串中創建一個JSON對象,然後你得到一個名爲results的數組(你可以看到數組和對象的名字,如果你只是將url粘貼到你的瀏覽器),然後根據你想要的,你得到另一個對象(或數組,取決於數據如何格式化)並獲取名爲「name」的對象的文本。 – 2012-07-18 21:55:03

1

我很驚訝你沒有收到任何錯誤。

從這個documentation判斷,JSON響應應該是一個對象,而不是一個數組。你不能只用解析twitter響應的代碼並將其應用於不同的格式。

我手頭沒有google api key,你能提供一個你正在獲取的數據的例子嗎?如果文件相匹配,那麼你需要的東西是這樣的:

JSONObject responseOb = new JSONObject(data); 
JSONArray results = responseOb.getJSONArray("results"); 
String firstAddress = results.getJSONObject(0).getString("formatted_address");