Не удается разобрать json с помощью JSONArray в Android

Я хочу преобразовать строку 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();

...

Я не знаю почему, но мой ответ добавил пустой символ (или что-то в этом роде, потому что функция обрезки не сработала, но отладчик тоже ничего не показал) в позиции 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, поэтому, возможно, это глупый вопрос, я просто хочу знать для будущих случаев. Спасибо всем, кто помог своими комментариями.


person Jauuu    schedule 12.04.2011    source источник
comment
Опубликованный вами JSON действителен. Я только что попытался разобрать его в JSONArray на Android, и это сработало. Я бы перепроверил строку, это то, что вы думаете, и в начале или в конце нет лишних символов.   -  person Jim Blackler    schedule 12.04.2011
comment
опубликуйте значение переменной result как есть. Обрежьте значение результата и проверьте.   -  person sat    schedule 12.04.2011
comment
Я сделал это, но проблема все еще остается. Я отредактировал сообщение, чтобы показать вам значение переменной.   -  person Jauuu    schedule 12.04.2011
comment
Зачем добавлять новый символ строки в строку при каждой прочитанной строке файла? Это заставило бы меня поверить, что на самом деле что-то в строке 1 добавляется \n, и тогда ваша строка JSON недействительна?   -  person Bill Mote    schedule 12.04.2011
comment
Я согласен, + "\n" может иметь нежелательные последствия.   -  person Jim Blackler    schedule 12.04.2011
comment
Это не проблема. Я удалил его, и результаты такие же.   -  person Jauuu    schedule 12.04.2011
comment
Попробуйте использовать JSONTokener для разбора исходной строки ответа.   -  person Olegas    schedule 12.04.2011
comment
Я уже пытался создать токен с переменной результата, а затем создать jsonarray с токеном, и я получаю аналогичную ошибку. Вы это имели в виду?   -  person Jauuu    schedule 12.04.2011
comment
У кого-нибудь есть еще идеи или ссылки на примеры, чтобы сделать то же самое по-другому?   -  person Jauuu    schedule 12.04.2011
comment
Я жестко закодировал строку и попробовал, ошибки нет!   -  person sat    schedule 12.04.2011
comment
Проблема решена, но до сих пор не знаю, почему я получаю пустой символ, который привел меня к ошибке. Спасибо вам всем.   -  person Jauuu    schedule 13.04.2011
comment
Решено, это был символ спецификации UTF-8. Черт, я этого не помнил.   -  person Jauuu    schedule 13.04.2011


Ответы (1)


По крайней мере, у меня есть окончательное решение.

Проблема заключалась в том, что мой формат файла php - utf-8 с символом спецификации. Спецификация - это то, что доставляло мне проблемы. Все, что мне нужно сделать, это открыть файл с помощью Notepad ++, выбрать «Кодировка» -> «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());
        }

Это все.

person Jauuu    schedule 13.04.2011