Получение JSON с сервера

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Аватара пользователя
sanu0074
Сообщения: 80
Зарегистрирован: 30 июн 2013, 20:42
Контактная информация:

Получение JSON с сервера

Сообщение sanu0074 » 18 дек 2013, 12:05

Есть класс который принимает строку URL и возвращает JSONObject:

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

public class Json {
	
	public static JSONObject getJson(String url){
		
		InputStream is = null;
		String result = "";
		JSONObject jsonObject = null;
		Log.d("mylog", "http_url="+url);
		// HTTP
		try {	    	
			HttpClient httpclient = new DefaultHttpClient(); // for port 80 requests!
			HttpPost httppost = new HttpPost(url);
			HttpResponse response = httpclient.execute(httppost);
			HttpEntity entity = response.getEntity();
			is = entity.getContent();
		} catch(Exception e) {
			return null;
		}
		Log.d("mylog", "// Read response to string");
		// Read response to string
		try {	    	
			BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"),8);
			StringBuilder sb = new StringBuilder();
			String line = null;
			while ((line = reader.readLine()) != null) {
				sb.append(line + "\n");
			}
			is.close();
			result = sb.toString();	 
			Log.d("mylog", "result="+result);
		} catch(Exception e) {
			return null;
		}
 
		// Convert string to object
		try {
			jsonObject = new JSONObject(result);            
		} catch(JSONException e) {
			return null;
		}
		Log.d("mylog", "jsonObject="+jsonObject);
		return jsonObject;
 
	}
	
}


Вызов из активити (запись в лог):

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

Log.d("mylog", "JSON > "+Json.getJson("http://home-android.ru/client/autch"));
В лог попадает null, не пойму почему, даже в классе Json процедура не доходит до строки: Log.d("mylog", "// Read response to string");

Строка которую возвращает сервер:

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

{"login":"sanu0074","pass":"pwd2"}
В чем тут проблема?

Аватара пользователя
alexmedv
Сообщения: 29
Зарегистрирован: 29 май 2013, 12:55

Re: Получение JSON с сервера

Сообщение alexmedv » 18 дек 2013, 12:27

даже в классе Json процедура не доходит до строки
Так показывай стектрейс. Скорее всего проблема у тебя из-за того, что пытаешься взаимодействовать с сетью из главного потока

Аватара пользователя
sanu0074
Сообщения: 80
Зарегистрирован: 30 июн 2013, 20:42
Контактная информация:

Re: Получение JSON с сервера

Сообщение sanu0074 » 18 дек 2013, 12:43

alexmedv писал(а): Так показывай стектрейс. Скорее всего проблема у тебя из-за того, что пытаешься взаимодействовать с сетью из главного потока
Да, и правда, сделал в новом потоке, работает:

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

new Thread() {	//открываем новый поток
    		@Override
            public void run() {
    			Log.d("mylog", "JSON > "+Json.getJson("http://home-android.ru/client/autch"));
            }
		}.start();
Но теперь лог так выглядит:

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

12-18 11:41:04.544: D/mylog(16566): http_url=http://home-android.ru/client/autch
12-18 11:41:04.944: D/mylog(16566): // Read response to string
12-18 11:41:04.944: D/mylog(16566): result={"login":"sanu0074","pass":"pwd2"}
12-18 11:41:04.964: D/mylog(16566): JSON > null
т.е. строку от сервера получает, а JSONObject возвращать нехочет... т.е. ошибка на этом участке:

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

// Convert string to object
		try {
			jsonObject = new JSONObject(result);            
		} catch(JSONException e) {
			return null;
		}
		Log.d("mylog", "jsonObject="+jsonObject);
		return jsonObject;
Что здесь может быть?

Аватара пользователя
sanu0074
Сообщения: 80
Зарегистрирован: 30 июн 2013, 20:42
Контактная информация:

Re: Получение JSON с сервера

Сообщение sanu0074 » 18 дек 2013, 12:46

Вот что в стек трейсе:

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

12-18 11:46:03.914: E/myLOG(17965): org.json.JSONException: Value  of type java.lang.String cannot be converted to JSONObject
12-18 11:46:03.914: E/myLOG(17965): 	at org.json.JSON.typeMismatch(JSON.java:111)
12-18 11:46:03.914: E/myLOG(17965): 	at org.json.JSONObject.<init>(JSONObject.java:158)
12-18 11:46:03.914: E/myLOG(17965): 	at org.json.JSONObject.<init>(JSONObject.java:171)
12-18 11:46:03.914: E/myLOG(17965): 	at ru.homeandroid.Json.getJson(Json.java:53)
12-18 11:46:03.914: E/myLOG(17965): 	at ru.homeandroid.MainActivity$1.run(MainActivity.java:98)

Аватара пользователя
adarash
Сообщения: 333
Зарегистрирован: 17 июл 2013, 09:59

Re: Получение JSON с сервера

Сообщение adarash » 18 дек 2013, 13:01

я попробовал. Ты что-то в php начюдил. У тебя первый символ "пробел" (один или два, не знаю) и он на них ругается

Аватара пользователя
sanu0074
Сообщения: 80
Зарегистрирован: 30 июн 2013, 20:42
Контактная информация:

Re: Получение JSON с сервера

Сообщение sanu0074 » 18 дек 2013, 13:16

adarash писал(а):я попробовал. Ты что-то в php начюдил. У тебя первый символ "пробел" (один или два, не знаю) и он на них ругается
там нет пробелов, толькочто смотрел, и в коде там просто:

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

echo json_encode(array("login"=>"sanu0074","pass"=>"pwd2"));

Аватара пользователя
sanu0074
Сообщения: 80
Зарегистрирован: 30 июн 2013, 20:42
Контактная информация:

Re: Получение JSON с сервера

Сообщение sanu0074 » 18 дек 2013, 13:25

добавил заголовок в PHP, тоже не помогло:

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

header('Content-type: application/json');

Аватара пользователя
adarash
Сообщения: 333
Зарегистрирован: 17 июл 2013, 09:59

Re: Получение JSON с сервера

Сообщение adarash » 18 дек 2013, 13:44

sanu0074 писал(а):добавил заголовок в PHP, тоже не помогло:

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

header('Content-type: application/json');
Короче я не знаю что там у тебя и как. Но у меня все работает. Надо код - пиши в личку почту.

Аватара пользователя
sanu0074
Сообщения: 80
Зарегистрирован: 30 июн 2013, 20:42
Контактная информация:

Re: Получение JSON с сервера

Сообщение sanu0074 » 18 дек 2013, 13:51

у меня не работает, все эти способы не работают:

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

preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $json);
preg_replace('/[[:cntrl:]]/', '', $json);
preg_replace('/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]/', '', $json);
str_replace("\\", "", $json);

Аватара пользователя
adarash
Сообщения: 333
Зарегистрирован: 17 июл 2013, 09:59

Re: Получение JSON с сервера

Сообщение adarash » 18 дек 2013, 14:13

Короче мне все равно, что у тебя не так. Но то, что ты где то накосячил - это факт. Что бы все работало предлагаю этот костыль

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

jObj = new JSONObject(json.substring(json.indexOf("{"), json.lastIndexOf("}") + 1));
А для парсинга json лучше использовать (!!!!!ИСКЛЮЧИТЕЛЬНО В ТВОЕМ СЛУЧАЕ!!!!!) следующий класс

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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class JSONRecuest {

	static InputStream is = null;
	static JSONObject jObj = null;
	static String json = "";

	public JSONRecuest() {

	}

	public JSONObject makeHttpRequest(String url, String method,
			List<NameValuePair> params) {
		try {
			if (method == "POST") {
				DefaultHttpClient httpClient = new DefaultHttpClient();
				HttpPost httpPost = new HttpPost(url);
				httpPost.setEntity(new UrlEncodedFormEntity(params));

				HttpResponse httpResponse = httpClient.execute(httpPost);
				HttpEntity httpEntity = httpResponse.getEntity();
				is = httpEntity.getContent();

			} else if (method == "GET") {
				DefaultHttpClient httpClient = new DefaultHttpClient();
				String paramString = URLEncodedUtils.format(params, "utf-8");
				url += "?" + paramString;
				HttpGet httpGet = new HttpGet(url);

				HttpResponse httpResponse = httpClient.execute(httpGet);
				HttpEntity httpEntity = httpResponse.getEntity();
				is = httpEntity.getContent();
			}
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					is, "utf-8"), 8);
			StringBuilder sb = new StringBuilder();
			String line = null;
			while ((line = reader.readLine()) != null) {
				sb.append(line + "\n");
			}
			is.close();
			json = sb.toString();
		} catch (Exception e) {
			Log.e("Buffer Error", "Error converting result " + e.toString());
		}
		try {
			jObj = new JSONObject(json.substring(json.indexOf("{"),
					json.lastIndexOf("}") + 1));
		} catch (JSONException e) {
			Log.e("JSON Parser", "Error parsing data " + e.toString());
		}
		return jObj;

	}
}

Вызывать так

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

List<NameValuePair> params = new ArrayList<NameValuePair>();
			JSONObject json = null;
			try {
				json = new JSONRecuest().makeHttpRequest(
						"http://home-android.ru/client/autch", "GET", params);

				Log.d("t1", json.toString());

			} catch (Exception e) {

				Log.e("HTTPError", e.toString());

			}

Аватара пользователя
sanu0074
Сообщения: 80
Зарегистрирован: 30 июн 2013, 20:42
Контактная информация:

Re: Получение JSON с сервера

Сообщение sanu0074 » 18 дек 2013, 14:24

adarash писал(а):Короче мне все равно, что у тебя не так. Но то, что ты где то накосячил - это факт. Что бы все работало предлагаю этот костыль

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

jObj = new JSONObject(json.substring(json.indexOf("{"), json.lastIndexOf("}") + 1));
костыль выручил) спасибо громадное)

Ответить