解析Google在Android中放置JSON数据?

解析Google在Android中放置JSON数据?,android,json,google-places-api,Android,Json,Google Places Api,我试图在Android中解析GooglePlacesJSON数据。我知道我传递的URL是有效的(但我从下面的代码中取出了我的密钥)。我可以获取要在TextView中显示的JSON数据,但现在我想解析它并获取(此时)要显示的第一个项的名称。我修改了一个解析twitter提要的教程,该twittwr教程显示正确,但修改后的代码没有显示任何内容。它不会崩溃,我也不会出错,所以我不知道出了什么问题。这是我的代码: public class GetPort extends Activity {

我试图在Android中解析GooglePlacesJSON数据。我知道我传递的URL是有效的(但我从下面的代码中取出了我的密钥)。我可以获取要在TextView中显示的JSON数据,但现在我想解析它并获取(此时)要显示的第一个项的名称。我修改了一个解析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;
    }

}

}
公共类GetPort扩展活动{
文本视图显示数据;
HttpClient;
JSONObject json;
最终静态字符串pURL=”https://maps.googleapis.com/maps/api/place/search/json? 位置=30.487263,-97.970799&半径=25000&类型=机场和传感器=假钥匙=我的钥匙”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.mn_test3);
showJSdata=(TextView)findviewbyd(R.id.http\u-tv);
client=新的DefaultHttpClient();
新建ReadURL()。执行(“名称”);
}
公共JSONObject showPorts()
抛出ClientProtocolException、IOException、JSONException{
StringBuilder端口URL=新的StringBuilder(pURL);
HttpGet=newhttpget(portURL.toString());
HttpResponse r=client.execute(get);
int status=r.getStatusLine().getStatusCode();
如果(状态==200){
HttpEntity e=r.getEntity();
字符串数据=EntityUtils.toString(e);
JSONArray时间线=新JSONArray(数据);
JSONObject lastport=timeline.getJSONObject(0);
返回最后一个端口;
}否则{
Toast.makeText(GetPort.this,“oops”,Toast.LENGTH\u SHORT);
返回null;
}
}
公共类ReadURL扩展了异步任务{
@凌驾
受保护的void onPostExecute(字符串结果){
showJSdata.setText(结果);
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
试一试{
json=showPorts();
返回json.getString(参数[0]);
}捕获(客户端协议例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(JSONException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回null;
}
}
}

有人能看到代码哪里出错了,或者我哪里出错了吗?

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

由此判断,JSON响应应该是一个对象,而不是一个数组。您不能只使用解析twitter响应的代码并将其应用于其他格式

我手头没有google api密钥,您能提供一个您正在获取的数据示例吗?如果它与文档相匹配,那么您需要以下内容:

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

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

由此判断,JSON响应应该是一个对象,而不是一个数组。您不能只使用解析twitter响应的代码并将其应用于其他格式

我手头没有google api密钥,您能提供一个您正在获取的数据示例吗?如果它与文档相匹配,那么您需要以下内容:

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

我对你的代码做了一些修改,得到了以下结果:

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?
部分后面有一个空格。 您需要首先从数据创建一个对象,然后解析它。将数组名称作为
结果
然后获取其中的任何对象,并获取其字符串


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

好吧,我稍微更改了你的代码,得到了以下结果:

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?
部分后面有一个空格。 您需要首先从数据创建一个对象,然后解析它。将数组名称作为
结果
然后获取其中的任何对象,并获取其字符串


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

首先,您确定您的应用程序到达了解析JSON的行吗?尝试在那里添加Log.d(),然后查看。我现在要讨论一下,这只是为了安全起见,你确定你的应用程序能够解析JSON吗?尝试在那里添加Log.d(),然后查看。我现在要检查一下,这只是为了安全。非常感谢你!它起作用了!因此,如果我正确解释了您的解决方案,您必须将“数据”字符串传递到JSONObject中,然后将JSONArray应用于新的JSONObject。。。正确的?我没有创建新的JSONObject,我只是将“数据”字符串直接传递到JSONArray.BTW中,URL中的空格是在我将代码粘贴到本文中时出现的。我的活动代码里没有。是的,你说得对。您从收到的字符串创建一个JSON对象,然后获取名为results的数组(如果您只是将url粘贴到浏览器中,您可以看到数组和对象名称),然后根据需要获取另一个对象(或数组,取决于数据的格式)并获取名为“name”的对象的文本对你来说,非常感谢你,等等!它起作用了!因此,如果我正确解释了您的解决方案,您必须将“数据”字符串传递到JSONObject中,然后将JSONArray应用于新的JSONObject。。。正确的?我没有创建新的JSONObject,我只是将“数据”字符串直接传递到