我正在尝试解析Android中的Google Places JSON数据。我知道我传入的URL工作(但我从下面的代码中取出了我的密钥)。我可以将JSON数据显示在TextView中,但现在我想解析它并获得(此时)要显示的第一个项目的名称。我修改了一个解析twitter提要的教程,并且twittwr教程正确显示,但我的修改后的代码没有显示任何内容。它没有崩溃,我没有任何错误,所以我不知道什么是错的。所以这是我的代码:
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 :(得分: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;
}
您可以通过将其粘贴到浏览器的地址行来查看整个输出。
还要注意,在网址中的json?
部分后面有空格。
首先需要从数据中创建一个对象,然后解析它。将数组名称设为results
然后获取其中的任何对象,并取其字符串。
此外,当我运行你的代码(使用我的API密钥)时,我确实收到错误,而不是导致应用程序崩溃的致命错误,但解析JSON时出错(在logcat中以橙色显示)
答案 1 :(得分:1)
我很惊讶你没有收到任何错误。
从这个documentation来看,JSON响应应该是一个对象,而不是一个数组。您不能只采用解析Twitter响应的代码并将其应用于其他格式。
我手头没有谷歌API密码,你能提供一个你得到的数据的例子吗?如果它与文档匹配,那么你需要这样的东西:
JSONObject responseOb = new JSONObject(data);
JSONArray results = responseOb.getJSONArray("results");
String firstAddress = results.getJSONObject(0).getString("formatted_address");