2012-07-18 98 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");