2012-04-04 110 views
2

我的PHP成功地从我的SQL表中返回JSON。但是我的Android代码将它全部存储在一个字符串中。它应该确实存储在一个字符串中,然后解析成多个对象?这是相关的代码。解析JSON到JSONArray

首先,什么存储结果看起来像目前:

04-04 21:26:00.542: V/line(1230): [{"category":"elections","id":"0","title":"Who will you vote for in November's Presidential election?","published":"2012-04-02","enddate":"2012-04-30","responsetype":"0"},{"category":"elections","id":"2","title":"Question title, ladies and gents","published":"2012-04-02","enddate":"2012-04-30","responsetype":"1"}] 

所以这很明显都只是专卖店为一个巨大的字符串,即使它的这两行。这里是我生产这条线的代码:

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

    // Making HTTP request 
try { 
     // defaultHttpClient 
     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(); 

    } 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) { 
      Log.v("while", line); 
      sb.append(line + "\n"); 
      //Log.v("err", line); 
     } 
     is.close(); 
     json = sb.toString(); 


    } catch (Exception e) { 
     Log.e("Buffer Error", "Error converting result " + e.toString()); 
    } 

    // try parse the string to a JSON object 
    try { 
     jObj = new JSONObject(json); 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    } 

    // return JSON String 
    return jObj; 

} 

很明显,我在我的WHILE循环之后立即出现了各种各样的错误。我已经花了几天的时间尝试整理它,但只是刚刚得到PHP返回正确的JSON(它以前没有)。我期望我需要一个JSONArray,每个JSON结果存储在Array的一个索引内 - 所以我希望需要将此方法的返回值更改为JSONArray,这是否正确?任何人都可以引导我解析从我的PHP脚本收到的JSON的正确路径吗?

+0

JSON只是一种传输格式。一旦你在应用中获得了json字符串,你就可以将它解码为原生数据结构。你从不直接操纵JSON字符串本身。 – 2012-04-04 21:38:26

+0

我明白,马克B.我想我的问题(正如你可以在上面的Java中看到的),我从读者的唯一有效方法是readLine(),它将所有的JSON一次存储到一个字符串中。我应该继续解析该字符串吗? – Davek804 2012-04-04 21:39:34

+0

有些库可以将JSON反序列化为域对象,例如GSON,这使得这一块蛋糕。 – 2012-04-04 21:40:48

回答

1

是的,这是正确的。您需要将其解析为JSONArray,因为它就是这样。例如(忽略例外等):

JSONArray jarr = new JSONArray(jsonString); 
for (int i = 0; i < jarr.length(); ++i) { 
    JSONObject jobj = jarr.getJSONObject(i); 
    // work with object 
} 
+0

这工作完美无瑕。很显然,我仍然需要为getTitle,getID等等编写代码,但是现在我应该更直接地将每个JSON片作为自己的对象。非常感谢你 - 这三个Stack Overflow问题只是为了能够理清我应该如何向你所有的天才请教你的专家指导。非常感激! – Davek804 2012-04-04 21:47:41

+0

另外,我已经捕获了所有的POS例外 - 但是如果这仍然是一个问题,我肯定会像泰勒上面所说的那样查看像GSON这样的外部库。 – Davek804 2012-04-04 21:48:32

+0

很高兴我能帮到你。顺便说一句,从我短暂的经历,当适当的工作与这些类,你应该能够做很多事情,我不认为你需要移动到GSON,但这是一个品味问题:) – MByD 2012-04-04 21:53:03