1

我正在尝试在 Android 中解析 Google Places JSON 数据。我知道我传递的 URL 有效(但我从下面的代码中取出了我的密钥)。我可以让 JSON 数据显示在 TextView 中,但现在我想解析它并获取(此时)要显示的第一个项目的名称。我修改了一个解析 twitter 提要的教程,该 tittwr 教程正确显示,但我修改后的代码什么也没显示。它不会崩溃,我也没有收到任何错误,所以我不知道出了什么问题。所以这是我的代码:

    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;
    }

}

}

谁能看到代码失败的地方,或者我哪里出错了?

4

2 回答 2

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?另请注意,您在 url 部分之后有一个空格。您需要首先从数据中创建一个对象,然后对其进行解析。将数组名称作为results 然后获取其中的任何对象,并获取其字符串。

此外,当我运行您的代码(使用我的 API 密钥)时,我确实收到了错误,不是导致您的应用程序崩溃的致命错误,而是解析 JSON 时出现的错误(在 logcat 中显示为橙色)

于 2012-07-18T21:10:02.747 回答
1

我很惊讶你没有收到任何错误。

从这个文档来看,JSON 响应应该是一个对象,而不是一个数组。您不能只使用解析 twitter 响应的代码并将其应用于不同的格式。

我手头没有 google api 密钥,你能提供一个你得到的数据的例子吗?如果它与文档匹配,那么您需要这样的东西:

JSONObject responseOb = new JSONObject(data);
JSONArray results = responseOb.getJSONArray("results");
String firstAddress = results.getJSONObject(0).getString("formatted_address");
于 2012-07-18T21:01:06.880 回答