【问题标题】:Parsing JSON into JSONArray将 JSON 解析为 JSONArray
【发布时间】:2012-04-18 15:52:43
【问题描述】:

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

首先,当前存储的结果是什么样的:

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 的路径?

【问题讨论】:

  • JSON 只是一种传输格式。在应用程序中获得 json 字符串后,您可以将其“解码”回本机数据结构。您永远不会直接操作 JSON 字符串本身。
  • 我明白了,Marc B。我想我的问题(如您在上面的 Java 中所见)是我从 reader 获得的唯一有效方法是 readLine(),它一次存储所有 JSON成一个字符串。我应该继续解析那个字符串吗?
  • 有些库可以将 JSON 反序列化为域对象,例如GSON,这让这变得轻而易举。
  • 感谢 Tyler,在整理这些内容的过程中,我当然听说过不少关于 GSON 的信息。如果事实证明我仍然对这一切有疑问,我很可能会考虑合并该库。

标签: php android sql json


【解决方案1】:

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

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

【讨论】:

  • 这工作完美无缺。显然,我仍然需要整理 getTitle、getID 等的代码,但是现在我将每个 JSON 片段都作为自己的对象,这应该更加简单明了。非常感谢 - 这需要三个 Stack Overflow 问题才能弄清楚我应该如何向所有天才寻求专家指导。非常感谢!
  • 另外,我已经捕获了所有 POS 异常 - 但如果这仍然是一个问题,我肯定会像上面 Tyler 所说的那样研究像 GSON 这样的外部库。
  • 很高兴我能帮上忙。顺便说一句,根据我短暂的经验,当与这些课程一起工作时,你应该能够做很多事情,我认为你不需要搬到 GSON,但这是一个品味问题 :)
  • 是的。老实说,我不希望我需要,您提出的解决方案非常优雅,如果我注意我的表,几乎不会导致未捕获的异常。
猜你喜欢
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多