Как формировать JSON

Ответить
Аватара пользователя
piteriv
Сообщения: 58
Зарегистрирован: 03 янв 2015, 00:16
Откуда: Москва
Контактная информация:

Как формировать JSON

Сообщение piteriv » 27 июл 2016, 23:03

Здравствуйте!
Надо написать тестовое приложение для Андроид которое отправляет данные на сервер.
Пожалуйста, объясните как сформировать и отправить JSON запрос на сервер из JAVA-класса Андроид-приложения.
С уважением, Питер.

Sergey777
Сообщения: 68
Зарегистрирован: 30 мар 2015, 17:16

Re: Как формировать JSON

Сообщение Sergey777 » 30 июл 2016, 09:19

piteriv писал(а):Здравствуйте!
Надо написать тестовое приложение для Андроид которое отправляет данные на сервер.
Пожалуйста, объясните как сформировать и отправить JSON запрос на сервер из JAVA-класса Андроид-приложения.
С уважением, Питер.
Сформировать json можно например с помощью классов:

Код: Выделить всё

org.json.JSONObject;
org.json.JSONArray;
org.json.JSONException;
В простейшем случае для формирования json - строки типа:

Код: Выделить всё

{"data" : {"login" : "какой-то логин", "pass" : "какой-то пароль", "id" : 25}}
Нужно написать следующие:

Код: Выделить всё

JSONObject clientList = new JSONObject();
clientList.put("login","какой-то логин");
clientList.put("pass",pass);
clientList.put("id","какой-то пароль");
JSONObject listclient = new JSONObject();
listclient.put("data", clientList);
Для создания json - массивов используем JSONArray:

Код: Выделить всё

JSONObject jsonValue = new JSONObject();
JSONArray jsonArrayValue = new JSONArray();
for(int q = 1; q < 10; q++){
jsonArrayValue.put(q);
}
jsonValue.put("array",jsonArrayValue);
И мы получим строку такого типа:

Код: Выделить всё

{"array" : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}

Аватара пользователя
piteriv
Сообщения: 58
Зарегистрирован: 03 янв 2015, 00:16
Откуда: Москва
Контактная информация:

Re: Как формировать JSON

Сообщение piteriv » 31 июл 2016, 01:36

Спасибо!

Аватара пользователя
piteriv
Сообщения: 58
Зарегистрирован: 03 янв 2015, 00:16
Откуда: Москва
Контактная информация:

Re: Как формировать JSON

Сообщение piteriv » 31 июл 2016, 01:43

Я сделал HTTP-POST запрос в отдельном потоке.
Он работает. На сервере PHP-сценарий принимает POST, но только вместо кириллицы символы вопроса.
Как это исправить, подскажите плиз?
Вот код http post

Код: Выделить всё

HttpClient client = new DefaultHttpClient();
        		        HttpPost post = new HttpPost("http://anterra.vov.ru/form.php");
        		        List<NameValuePair> pairs = new ArrayList<NameValuePair>();
        		        pairs.add(new BasicNameValuePair("login",name.getText().toString()));
        		        try {
        					post.setEntity(new UrlEncodedFormEntity(pairs));
        				} catch (UnsupportedEncodingException e) {
        					e.printStackTrace();
        				}
        		        try {
        					HttpResponse responce = client.execute(post);
        				} catch (ClientProtocolException e) {
        					e.printStackTrace();
        				} catch (IOException e) {
        					e.printStackTrace();
        				}

Sergey777
Сообщения: 68
Зарегистрирован: 30 мар 2015, 17:16

Re: Как формировать JSON

Сообщение Sergey777 » 31 июл 2016, 23:50

piteriv писал(а):Я сделал HTTP-POST запрос в отдельном потоке.
Он работает. На сервере PHP-сценарий принимает POST, но только вместо кириллицы символы вопроса.
Как это исправить, подскажите плиз?
Вот код http post

Код: Выделить всё

HttpClient client = new DefaultHttpClient();
        		        HttpPost post = new HttpPost("http://anterra.vov.ru/form.php");
        		        List<NameValuePair> pairs = new ArrayList<NameValuePair>();
        		        pairs.add(new BasicNameValuePair("login",name.getText().toString()));
        		        try {
        					post.setEntity(new UrlEncodedFormEntity(pairs));
        				} catch (UnsupportedEncodingException e) {
        					e.printStackTrace();
        				}
        		        try {
        					HttpResponse responce = client.execute(post);
        				} catch (ClientProtocolException e) {
        					e.printStackTrace();
        				} catch (IOException e) {
        					e.printStackTrace();
        				}
Из Вашего кода не понятно чем является переменная name. А вообще советую для сервер-клиентских общений использовать REST библиотеки. Или хотя бы не через библиотечку Apache. Она сильно громоздкая. Подключите к проекту Retrofit 2.0, один раз разберитесь и станет легче. Ваша проблема связана с кодировкой данных. Когда Вы посылаете эти данные по протоколу HTTP все символы, кроме английских букв, цифр, а так же символы: / - _ \ & . ! ~ * ' ( ) заменяются на их цифровой код в UTF-8 со знаком %. Например, пробел заменяется на %20, символ / на %2F, русские буквы кодируются двумя байтами в UTF-8, поэтому, к примеру, Ц заменится на %D0%A6. Сервер должен знать, в какой кодировки ему приходят данные. Для этого нужно добавить к заголовкам в POST запросе: Content-Type", "application/json; charset=utf-8.
В Вашем случае нужно добавить эту строчку:

Код: Выделить всё

post.setHeader("Content-Type", "application/json; charset=utf-8");
и заменить строчку post.setEntity(new UrlEncodedFormEntity(pairs)); на эту:

Код: Выделить всё

post.setEntity(new UrlEncodedFormEntity(pairs, HTTP.UTF_8));

Аватара пользователя
piteriv
Сообщения: 58
Зарегистрирован: 03 янв 2015, 00:16
Откуда: Москва
Контактная информация:

Re: Как формировать JSON

Сообщение piteriv » 01 авг 2016, 01:27

Спасибо.

Ответить