SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
-
sanu0074
- Сообщения: 80
- Зарегистрирован: 30 июн 2013, 20:42
-
Контактная информация:
Сообщение
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");
Строка которую возвращает сервер:
В чем тут проблема?
-
alexmedv
- Сообщения: 29
- Зарегистрирован: 29 май 2013, 12:55
Сообщение
alexmedv » 18 дек 2013, 12:27
даже в классе Json процедура не доходит до строки
Так показывай стектрейс. Скорее всего проблема у тебя из-за того, что пытаешься взаимодействовать с сетью из главного потока
-
sanu0074
- Сообщения: 80
- Зарегистрирован: 30 июн 2013, 20:42
-
Контактная информация:
Сообщение
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
-
Контактная информация:
Сообщение
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
Сообщение
adarash » 18 дек 2013, 13:01
я попробовал. Ты что-то в php начюдил. У тебя первый символ "пробел" (один или два, не знаю) и он на них ругается
-
sanu0074
- Сообщения: 80
- Зарегистрирован: 30 июн 2013, 20:42
-
Контактная информация:
Сообщение
sanu0074 » 18 дек 2013, 13:16
adarash писал(а):я попробовал. Ты что-то в php начюдил. У тебя первый символ "пробел" (один или два, не знаю) и он на них ругается
там нет пробелов, толькочто смотрел, и в коде там просто:
Код: Выделить всё
echo json_encode(array("login"=>"sanu0074","pass"=>"pwd2"));
-
sanu0074
- Сообщения: 80
- Зарегистрирован: 30 июн 2013, 20:42
-
Контактная информация:
Сообщение
sanu0074 » 18 дек 2013, 13:25
добавил заголовок в PHP, тоже не помогло:
-
adarash
- Сообщения: 333
- Зарегистрирован: 17 июл 2013, 09:59
Сообщение
adarash » 18 дек 2013, 13:44
sanu0074 писал(а):добавил заголовок в PHP, тоже не помогло:
Короче я не знаю что там у тебя и как. Но у меня все работает. Надо код - пиши в личку почту.
-
sanu0074
- Сообщения: 80
- Зарегистрирован: 30 июн 2013, 20:42
-
Контактная информация:
Сообщение
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
Сообщение
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
-
Контактная информация:
Сообщение
sanu0074 » 18 дек 2013, 14:24
adarash писал(а):Короче мне все равно, что у тебя не так. Но то, что ты где то накосячил - это факт. Что бы все работало предлагаю этот костыль
Код: Выделить всё
jObj = new JSONObject(json.substring(json.indexOf("{"), json.lastIndexOf("}") + 1));
костыль выручил) спасибо громадное)