Вопрос по google-places-api, android, json – Парсинг данных Google JSON в Android?

1

Я пытаюсь проанализировать данные Google Places JSON в Android. Я знаю, что 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;
    }

}

}

Кто-нибудь может увидеть, где код не работает, или где я ошибся?

Во-первых, вы уверены, что ваше приложение попадает в строки, которые анализируют JSON? попробуйте добавить туда Log.d () и посмотрите. Я сейчас перейду, это просто для безопасности La bla bla

Ваш Ответ

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)

Кстати, пробел в URL произошел, когда я вставил свой код в это сообщение. Его нет в коде моей деятельности. kirktoon1882
Да, вы правы. Вы создаете объект JSON из полученной строки, затем берете массив с именем results (вы можете увидеть массив и имя объекта, если просто вставите URL-адрес в браузер), а затем, в зависимости от того, что вы хотите, вы получите другой объект (или массив, в зависимости от того, как данные отформатированы) и получить текст объекта с именем & quot; имя & quot; в твоем случае.
Большое спасибо Ла бла бла! Оно работает! Поэтому, если я правильно интерпретирую ваше решение, вы должны передать «данные». строка в JSONObject, затем примените JSONArray к новому JSONObject ... правильно? Я не создавал новый JSONObject, я просто передавал "данные" строка прямо в JSONArray. kirktoon1882
1

Судя по этомудокументацияответ JSON должен быть объектом, а не массивом. Вы не можете просто взять код, который анализирует ответ Twitter и применить его к другому формату.

У меня нет ключа API Google под рукой, не могли бы вы привести пример данных, которые вы получаете? Если это соответствует документации, то вам нужно что-то вроде этого:

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

Похожие вопросы