Подтвердить что ты не робот

Получить json из HttpResponse

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://my.server:8080/android/service.php");


List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("action", "getjson"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

HttpResponse response = httpclient.execute(httppost);

service.php генерирует строку json. Как мне получить его из моего response? Btw; Я включил библиотеку GSON, могу ли я использовать любые методы в ней, возможно?

Решения, подобные этому, выглядят довольно уродливо, imo: лучший способ обработать json из httpresponse android

Есть много лучших способов, верно?

Любая помощь приветствуется, спасибо


Update:

String json = EntityUtils.toString(response.getEntity());

похоже, делает трюк. Есть только одна небольшая проблема: строка обернута скобками []. Должен ли я удалить их вручную? Они генерируются php: s json_encode()

4b9b3361

Ответ 1

Проблема была в моем php файле. Удаление массива контейнеров из json-кодированного объекта заставило мой java-код работать.

Ответ 2

Я думаю, что проблема, с которой вы сталкиваетесь, похожа на мою собственную, с которой я столкнулся. Если вы запустите:

String json_string = EntityUtils.toString(response.getEntity());
JSONObject temp1 = new JSONObject(json_string);

Вышеприведенный код генерирует исключение, и похоже, что в нем виноваты скобки массива JSON. Но отлично, чтобы массив JSON был элементом верхнего уровня! Вам просто нужно использовать JSONArray() вместо JSONObject:

String json_string = EntityUtils.toString(response.getEntity());
JSONArray temp1 = new JSONArray(json_string);

Итак, вы должны знать, получаете ли вы JSONArray или один словарь, который является JSONObject в коде JSON.

Если вы привыкли к библиотекам разбора iOS/ Objective-C JSON, они используют один и тот же элемент верхнего уровня для работы с json-словарями и json-массивами, поэтому переход к миру JAVA/Android смутил меня в том, что у меня два типа для обработки JSON в зависимости от возвращаемого верхнего уровня.

Ответ 3

С помощью этого класса вы можете получать данные JSON либо с сервера, либо из вашей папки с ресурсами. Его можно легко изменить только на тот или иной. Если вам нужен адаптер, используйте jgilfelt, созданный здесь на getHub.

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        Bundle getArgs = this.getArguments();
        String URI = getArgs.getString(KEY_URI);//OR YOU CAN HARD CODE THIS OR GET THE STRING ANYWAY YOU LIKE.

        new GetJSONTask().execute(URI);
    }

    class GetJSONTask extends AsyncTask<String, Integer, String> {

        protected String doInBackground(String... arg0) {

            String uri = arg0[0];

            InputStream is = null;

            if (uri.contains("http") == true) {// Get JSON from URL
                try {
                    DefaultHttpClient httpClient = new DefaultHttpClient();
                    HttpPost httpPost = new HttpPost(uri);
                    HttpResponse httpResponse = httpClient.execute(httpPost);
                    HttpEntity httpEntity = httpResponse.getEntity();
                    is = httpEntity.getContent();

                    BufferedReader rd = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                    while ((line = rd.readLine()) != null) {
                        json += line;
                    }
                    rd.close();
                    return json;
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            } else {// Get JSON from Assets

                Writer writer = new StringWriter();
                char[] buffer = new char[1024];

                try {
                    InputStream jsonFile = getActivity().getAssets().open(uri);
                    Reader reader = new BufferedReader(new InputStreamReader(jsonFile, "UTF-8"));
                    int n;
                    while ((n = reader.read(buffer)) != -1) {
                        writer.write(buffer, 0, n);
                    }
                    jsonFile.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                json = writer.toString();
                // return JSON String
                return json;
            }
        }

        @Override
        protected void onPostExecute(String result) {
            try {
                showData(result);
            } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(getActivity(), "something went wrong", Toast.LENGTH_SHORT).show();
            }
        }
    }

    private void showData(String json) throws JSONException {
        JSONObject o = new JSONObject(json);
        JSONArray data = o.getJSONArray("results");
    }
}

Ответ 4

Если я возвращаю строку JSON из моей веб-службы, я обычно хочу вернуть ее к объекту JSON, например:

String response = client.getResponse();

    if (responseCode == 200)
    {                   
         JSONObject obj = new JSONObject(response);                                                             
    }