1

AndroidでGooglePlacesJSONデータを解析しようとしています。渡した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;
    }

}

}

コードがどこで失敗したのか、どこで失敗したのかを誰かが知ることができますか?

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の応答を解析するコードを取得して、別の形式に適用することはできません。

手元にGoogleAPIキーがありませんが、取得しているデータの例を教えてください。ドキュメントと一致する場合は、次のようなものが必要です。

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