it-roy-ru.com

получить 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

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

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


Обновление:

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

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

26
Johan

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

 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. 

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

20
MikeN

С помощью этого класса вы можете получать данные 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");
    }
}
2
user742030

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

1
Johan

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

String response = client.getResponse();

    if (responseCode == 200)
    {                   
         JSONObject obj = new JSONObject(response);                                                             
    }
0
John J Smith