Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Kir-malishev
71 / 71 / 57
Регистрация: 07.08.2016
Сообщений: 173
#1

Получить json в ответ на POST запрос - Программирование Android

08.01.2017, 00:17. Просмотров 715. Ответов 11

Никак не могу добиться получения json с помощью вывода его через echo в PHP скрипте.

Если перенаправлять запрос на файл .json, то всё нормально парсится в приложении. Но, если выводить через echo, возникает ошибка:
org.json.JSONException: Value  of type java.lang.String cannot be converted to JSONObject

Добавил в скрипт header('Content-type: application/json'); , но всё равно ничего не получается.
В логах полученная строка выводится нормально.

Запрос отправляю так:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
       @Override
        protected Boolean doInBackground(String... params) {
 
            try { 
                HttpParams httpParameters = new BasicHttpParams();
                HttpProtocolParams.setContentCharset(httpParameters, HTTP.UTF_8);
                HttpProtocolParams.setHttpElementCharset(httpParameters, HTTP.UTF_8);
                HttpClient hc = new DefaultHttpClient(httpParameters);
                hc.getParams().setParameter("http.protocol.content-charset", HTTP.UTF_8);
                hc.getParams().setParameter("http.protocol.version", HttpVersion.HTTP_1_1);
                hc.getParams().setParameter("http.socket.timeout", new Integer(2000));
                httpParameters.setBooleanParameter("http.protocol.expect-continue", false);
                ResponseHandler<String> res = new BasicResponseHandler();
                HttpPost postMethod = new HttpPost(params[0]);
                postMethod.getParams().setParameter(CoreProtocolPNames.USER_AGENT,
                        "User Agent");
                postMethod.getParams().setParameter("http.socket.timeout", new Integer(5000));
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                // параметры
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(nameValuePairs, "UTF-8");
                postMethod.setEntity(entity);
                byte[] response = hc.execute(postMethod, res).getBytes("ISO-8859-1");
                testReview = new String(response, "UTF-8");
                                } catch (Exception e) { 
                System.out.println("Exp=" + e);
            } 
            return null;
        }
Дальше уже передаю в функцию для парсинга:
Java
1
2
3
4
5
6
public void parsingJSON(String review) {
        try {
            JSONObject json = new JSONObject(review);
            JSONArray data = json.getJSONArray("testreview");
            ////
}
Подскажите, пожалуйста, как можно решить эту проблему?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2017, 00:17
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Получить json в ответ на POST запрос (Программирование Android):

Послать POST запрос с параметрами и получить json
Всем привет! Столкнулся с проблемой. Как послать POST запрос и получить назад...

JSOUP POST. В ответ вместо JSon приходит разметка страницы с полями для ввода данных
Делаю пост запрос к апи сайта. Назад должен получить json, однако получаю...

Как отправлять get, post запрос а затем обработать в формате json?
Как на android srudio отправить post, ger запрос, затем обработать ответ в...

Отправить post запрос с параметрами на сайт и получить результат
Всем привет! Делаю проект для сайта школы. Нужно отправить post запрос с...

JSON ответ в виде \uXXXX
Добрый день. Делаю запрос к серверу методом GET. Ответ приходит в виде JSON,...

Как распарсить Json-ответ Android приложении?
Добрый день! Android приложение получает ответ от сервера в формате Json....

11
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
08.01.2017, 10:34 #2
Kir-malishev, покажите что приходит
0
Kir-malishev
71 / 71 / 57
Регистрация: 07.08.2016
Сообщений: 173
08.01.2017, 11:11  [ТС] #3
Приходит во всех случаях такого вида строка:
JSON
1
{"testreview":[{"nametest":"тест","id":"101D82"}]}
0
Pablito
2652 / 2134 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
09.01.2017, 12:09 #4
чес какой-то, строка нормальная и массив достается правильно
где полный лог ошибки? где вызов метода parsingJSON?
0
Kir-malishev
71 / 71 / 57
Регистрация: 07.08.2016
Сообщений: 173
09.01.2017, 17:13  [ТС] #5
Сохранил логи в блокнот и увидел, что в начале строки есть какие-то два лишних символа.
Вот логи:
01-09 16:45:43.811: D/JSON(25477): ??{"testreview":[{"nametest":"testing","id":"101EYX"},{"nametest":"тест","id":"101F7K"}]}
01-09 16:45:43.812: W/System.err(25477): org.json.JSONException: Value ? of type java.lang.String cannot be converted to JSONObject
01-09 16:45:43.813: W/System.err(25477): at org.json.JSON.typeMismatch(JSON.java:111)
01-09 16:45:43.813: W/System.err(25477): at org.json.JSONObject.<init>(JSONObject.java:159)
01-09 16:45:43.814: W/System.err(25477): at org.json.JSONObject.<init>(JSONObject.java:172)
01-09 16:45:43.815: W/System.err(25477): at app.teacher.MyTestsActivity.parsingJSON(MyTestsActivity.java:91)
01-09 16:45:43.816: W/System.err(25477): at app.teacher.MyTestsActivity$Task.onPostExecute(MyTestsActivity.java:411)
01-09 16:45:43.816: W/System.err(25477): at app.teacher.RequestTask.onPostExecute(RequestTask.java:1)
01-09 16:45:43.817: W/System.err(25477): at android.os.AsyncTask.finish(AsyncTask.java:632)
01-09 16:45:43.817: W/System.err(25477): at android.os.AsyncTask.access$600(AsyncTask.java:177)
01-09 16:45:43.817: W/System.err(25477): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
01-09 16:45:43.817: W/System.err(25477): at android.os.Handler.dispatchMessage(Handler.java:110)
01-09 16:45:43.817: W/System.err(25477): at android.os.Looper.loop(Looper.java:193)
01-09 16:45:43.817: W/System.err(25477): at android.app.ActivityThread.main(ActivityThread.java:5299)
01-09 16:45:43.817: W/System.err(25477): at java.lang.reflect.Method.invokeNative(Native Method)
01-09 16:45:43.817: W/System.err(25477): at java.lang.reflect.Method.invoke(Method.java:515)
01-09 16:45:43.817: W/System.err(25477): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829)
01-09 16:45:43.818: W/System.err(25477): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645)
01-09 16:45:43.818: W/System.err(25477): at dalvik.system.NativeStart.main(Native Method)

Причём в среде этого не видно!

Я решил проблему, добавив строчку:

Java
1
result = result.substring(result.indexOf('{'), result.length());
Но, может, можно как-то сделать, чтобы этих символов не было изначально?
0
Миниатюры
Получить json в ответ на POST запрос  
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
09.01.2017, 18:05 #6
Kir-malishev, и что это за символы? Коды их есть?
0
Kir-malishev
71 / 71 / 57
Регистрация: 07.08.2016
Сообщений: 173
09.01.2017, 19:17  [ТС] #7
Это, оказывается, вот такое чудо:
https://unicode-table.com/ru/FEFF/

Посмотрел, у меня на сервере к основному скрипту подключается два скрипта в кодировке UTF-8 with BOM. Поменял на UTF-8, однако ситуация не изменилась.
0
demixdn
288 / 235 / 70
Регистрация: 31.10.2016
Сообщений: 563
09.01.2017, 19:52 #8
Цитата Сообщение от Kir-malishev Посмотреть сообщение
byte[] response = hc.execute(postMethod, res).getBytes("ISO-8859-1");
testReview = new String(response, "UTF-8");
Может в этом дело?
0
Kir-malishev
71 / 71 / 57
Регистрация: 07.08.2016
Сообщений: 173
09.01.2017, 20:07  [ТС] #9
Без этого абракадабра выходит. И всё равно не парсится.
0
demixdn
288 / 235 / 70
Регистрация: 31.10.2016
Сообщений: 563
09.01.2017, 20:33 #10
Java
1
2
byte[] response = hc.execute(postMethod, res).getBytes("UTF-8");
testReview = new String(response, "UTF-8");
т.е. такой код не работает?
0
Pablito
2652 / 2134 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
09.01.2017, 21:00 #11
код из первого сообщения ацкий ад и масло-масляное
почему- бы не подключить что-то типа OkHttp и не убрать десяток лишних строк с хидерами/таймаутами и прочей ерундой?
1
Kir-malishev
71 / 71 / 57
Регистрация: 07.08.2016
Сообщений: 173
10.01.2017, 00:32  [ТС] #12
Спасибо за совет.
Обязательно переделаю всё. Но потом.
0
10.01.2017, 00:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2017, 00:32
Привет! Вот еще темы с решениями:

Retrofit, JSON, @POST, @GET
Уважаемые программисты, прошу вашей помощи! Хожу на курсы по разработке...

Передать JSON в теле POST запроса?
Хочу подключиться к сайту но не могу понять как предавать json в post запросе?...

Как посылать в POST-запросе Мега-JSON?
Имею такой json: { &quot;name&quot;: &quot;name&quot;, &quot;cnp&quot;: 123456789, ...

Отправить Get запрос и увидеть ответ сервера
делаю так: HttpClient httpclient = new DefaultHttpClient(); HttpGet...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru