2013-08-05 4 views
0

Ошибка при разборе строки JSON в Android. Строка сама по себе выглядит нормально, по крайней мере, похоже на то, что я намеревался вернуть. Но я рушился, пытаясь разобрать его. Может ли кто-нибудь понять, почему? Благодаря!Ошибка разбора строки JSON в Android

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

public JSONObject makeHttpRequest(String url, List<NameValuePair> params) { 

     // Making HTTP request 
     try { 
      // defaultHttpClient 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url); 
      if (params != null) { 
       httpPost.setEntity(new UrlEncodedFormEntity(params)); 
      } 

      HttpResponse httpResponse = httpClient.execute(httpPost); 
      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, "iso-8859-1"), 8); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "n"); 
      } 
      is.close(); 
      json = sb.toString(); 
      Log.e("JSON", json); 
     } catch (Exception e) { 
      Log.e("Buffer Error", "Error converting result " + e.toString()); 
     } 

     // try parse the string to a JSON object 
     try { 
      System.err.println("start try3"); //<--fine here 
      System.err.println(json);   //<--json string looks good 
      jObj = new JSONObject(json);  
      System.err.println("done try3"); //<--never outputs 
     } catch (JSONException e) { 
      Log.e("JSON Parser", "Error parsing data " + e.toString()); 
     } 

     // return JSON String 
     return jObj; 

    } 

Трассировка стека:

08-05 15: 28: 00,665: Е/JSON Parser (20009): данные об ошибках синтаксического анализа org.json.JSONException: Значение [{ "ID" : "3", "bool_gets_sms": "0", "picture_url": "нет", "электронная почта": "[email protected]", "клетка": "12345", "имя": "Вереск"}, { "ID": "7", "bool_gets_sms": "0", "picture_url": "нет", "электронная почта": "[email protected]", "клетка": "12335", "имя":» Алан "}, {" ID ":" 10" , "bool_gets_sms": "0", "picture_url": "нет", "электронная почта": "[email protected]", "клетка": "12345",» имя ":" Jenni "}, {" ID ":" 11" , "bool_gets_sms": "0", "picture_url": "Ничего", "электронная почта": "[email protected]", "клетка":» 12345" , "имя": "Джефф"}, { "ID": "24",» bool_gets_sms ":" 0 "," picture_url ":" none "," email ":" [email protected] "," cell ":" 12345 "," name ":" Rob "}] типа org.json .JSONArray не может быть преобразован в JSONObject

ответ

0

Вы создаете экземпляр JSONObject, то есть JSONArray, изменяете этот тип данных и конструктор.

С вашей трассировки стека:

of type org.json.JSONArray cannot be converted to JSONObject 

Таким образом, вместо этого:

static JSONObject jObj = null; 
// ... 
jObj = new JSONObject(json); 

Это:

static JSONArray jArr = null; //changed jObj to jArr for your naming conventions too... 
// ... 
jArr = new JSONArray(json); 

Вы должны знать, какой тип организации данных сервер будет возвращать перед тем как сделать запрос, хотя вы можете узнать его программно, лучше знать заранее. JSON довольно прост, и вы можете read through the spec в минутах ТЛ ...; DR: фигурные скобки вокруг текста обозначает объект, скобки обозначает массив ...

+0

Я могу изменить то, что возвращает сервер. Переход на JSONArray очень проблематичен, поскольку он имеет много последующих последствий. Можете ли вы предложить, какой тип формата сервер должен возвращать, чтобы вписаться в класс JSONObject? – Alex

+0

@ usr55410 Все, что вам нужно сделать, это вложить этот массив в объект. На каком языке работает ваш сервер? – Tonithy

+0

php. Последняя строка в моем php-коде: 'echo json_encode ($ array);'. У меня есть полная гибкость, чтобы изменить это, если он будет легче вписываться в класс JSONObject. – Alex

0

Вы должны сделать это так:

JsonElement el = new JsonParser().parse(json); 
JSONObject obj= el.getAsJSONObject("the key you are looking for"); 

Точное имя методов может отличаться в зависимости от библиотеки, которую вы используете для разбора JSON. Постарайтесь получить массивы в JSONArray вместо JSONObject.

Смежные вопросы