#java #android #json #parsing #gson
#java #Android #json #Синтаксический анализ #gson
Вопрос:
Я хочу преобразовать json
строку в JSONArray, но она выдает jsonexception
Это очень странно, потому что причина ошибки, которую он выдает мне, кажется полностью ложной после отладки.
это важная часть кода:
…
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
InputStream is = entity.getContent();
// convert response to string
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(is, "utf-8"));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line "n");
}
is.close();
String result = sb.toString();
result.trim(); //added by recommendation in comments
// parse json data
try {
JSONArray jArray = new JSONArray(result); **//this line jumps to the exception**
//Also tried
//JSONTokener tokener = new JSONTokener(result);
//JSONArray jArray = new JSONArray(tokener); //jumps to the exception too
for (int i = 0; i < jArray.length(); i ) {
JSONObject json_data = jArray.getJSONObject(i);
TextView info = (TextView)findViewById(R.id.info);
String sInfo = "id: "
json_data.getInt("ID")
", descripció: "
json_data.getString("DESC")
", nick: "
json_data.getString("NICK")
", data de naixement: "
json_data.getString("DATA_NEIX");
info.setText(sInfo);
}
} catch (JSONException e) {
Log.e("log_tag", "Error parsing data "
e.toString());
}
Это подробное сообщение об исключении, которое я получаю при отладке:
A JSONArray text must start with '[' at character 1 of [{"ID":"1","NICK":"Jauuu","DESC":"Estic de proves amb php i mysql","FOTO":null,"DATA_NEIX":"1980-04-22","IDIOMA":null,"PAIS":"Espanya","GENERE":"H","ORIENTACIO":"heterosexu","ID_GRUP":null,"ESTAT":null,"ID_AMICS":null}]
Как вы можете видеть, '['
в символе 1 действительно есть. Я убедился в этом, просматривая строку позиция за позицией. Поэтому я не могу понять, где настоящая ошибка.
Пожалуйста, вы можете мне помочь? Я здесь совершенно потерялся. Заранее спасибо.
Примечание: Теперь я обрезал результирующую переменную и получаю ту же ошибку. Вот оно, его значение:
[{"ID":"1","NICK":"Jauuu","DESC":"Estic de proves amb php i mysql","FOTO":null,"DATA_NEIX":"1980-04-22","IDIOMA":null,"PAIS":"Espanya","GENERE":"H","ORIENTACIO":"heterosexu","ID_GRUP":null,"ESTAT":null,"ID_AMICS":null}]
Предварительное решение и вопросы:
Я решил проблему, добавив эту строку:
sb.deleteCharAt(0);
здесь:
...
sb.deleteCharAt(0);
String result = sb.toString();
result.trim();
...
Я не знаю почему, но мой ответ добавил пустой символ (или что-то в этом роде, потому что функция trim не сработала, но отладчик также ничего не показал) в позиции 0 моего StringBuilder. Проблема заключалась в том, что сообщение об исключении сбивало с толку и сообщало что-то как-то неправильно.
Все, что у меня было в моем php-файле, чтобы получить ответ, было таким:
<?php
mysql_connect("127.0.0.1","root","");
mysql_select_db("prova");
$q=mysql_query("SELECT * FROM perfil WHERE ID='".$_REQUEST['id']."'");
while($e=mysql_fetch_assoc($q))
$output[]=$e;
print(utf8_encode(json_encode($output)));
mysql_close();
?>
Теперь я решил проблему, но кто-нибудь знает, почему этот php добавляет этот пустой символ в мой ответ (он также добавляет его в конце)?. Я новичок в php, так что, возможно, это глупый вопрос, я просто хочу знать для будущих случаев. Спасибо всем вам, кто помог своими комментариями.
Комментарии:
1. Опубликованный вами JSON является допустимым. Я только что попробовал разобрать его в
JSONArray
на Android, и это сработало. Я бы дважды проверил, что строка соответствует тому, что вы думаете, и не содержит никаких дополнительных символов в начале или конце.2. опубликуйте значение переменной result как есть. Обрежьте значение результата и проверьте.
3. Я сделал это, но проблема все еще существует. Я отредактировал сообщение, чтобы показать вам значение переменной.
4. Зачем добавлять символ новой строки к строке в каждой прочитанной строке файла? Это заставило бы меня поверить, что на самом деле что-то в строке 1 добавляется n, и ваша строка JSON становится недействительной?
5. Я согласен,
"n"
это может иметь нежелательные эффекты.
Ответ №1:
По крайней мере, у меня есть окончательное решение.
Проблема заключалась в том, что мой формат файла php равен utf-8 с символом спецификации. Спецификация — это то, что вызывало у меня проблемы. Все, что мне нужно сделать, это открыть файл с помощью моего Notepad и выбрать Codification-> UTF-8 без спецификации и сохранить файл.
И для дальнейшего упрощения вот новая, более короткая и простая версия моего кода для Android:
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://10.0.2.2:8888/obtePerfil.php");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
//this line here is what saves a lot of work
String result = EntityUtils.toString(entity, HTTP.UTF_8);
// parse json data
try {
JSONArray jArray = new JSONArray(result);
for (int i = 0; i < jArray.length(); i ) {
JSONObject json_data = jArray.getJSONObject(i);
TextView info = (TextView) findViewById(R.id.info);
String sInfo = "id: " json_data.getInt("ID")
", descripció: "
json_data.getString("DESC") ", nick: "
json_data.getString("NICK")
", data de naixement: "
json_data.getString("DATA_NEIX");
info.setText(sInfo);
}
} catch (Exception e) {
Log.e("log_tag", "Error parsing data " e.toString());
}
} catch (Exception e) {
Log.e("log_tag", "Error in http connection " e.toString());
}
Вот и все.