【问题标题】:JSONObject vs JARRAY getting array lengthJSONObject vs JARRAY 获取数组长度
【发布时间】:2013-04-08 13:39:09
【问题描述】:

我有一个 JSONObject,我将它传递给一个方法以处理成 ArrayLists

{
    "set0" :
    {
        "title" : "Do you win?",
        "answer" : "1",
        "imgUrl" : "imag",
        "id" : "1"
    },
    "set1" :
    {
        "title" : "Did you loose?",
        "answer" : "1",
        "imgUrl" : "imag",
        "id" : "2"
     }
}

该方法的结构如下:

questions(JSONObject result){

    // initialization
    for(int i=0;i < result.length();i++){
        question_list.add(result.getJSONObject("set"+i).getString("title"));
        answer_list.add(result.getJSONObject("set"+i).getString("answer"));
        img_list.add(result.getJSONObject("set"+i).getString("imgUrl"));
        question_batch.add(result.getJSONObject("set"+i).getInt("id"));
    }
    // rest of code
}

我通常看到用于循环条件的 jsonarray 而不是 jsonobject 本身,当我的 jsonobject 变大但与上面发布的结构相同时,result.length() 会开始产生错误的结果,这是一个不正确的实现想要遍历他们的 jsonobject 的人?

【问题讨论】:

  • 看起来您的数据应该存储为 JSONArray,而不是 JSONObject,因为它表示多个相同类型的数据对象的列表,而不仅仅是单个数据对象。跨度>
  • 所以你会建议传递一个 JSONArray 而不是对象给方法?
  • 尽量用GSON代替自己解析。它更快且易于实施。

标签: java android json


【解决方案1】:

我不确定您的实现是否“不正确”,但这是我通常迭代 JSON 的方式。

int i = 0;
boolean continue = true;
while (continue){
    if (result.has("set" + i){

    JSONObject set = result.get("set" + i.toString());

    if (set.has("title"){
        question_list.add(set.getString("title");
    }
    if (set.has("answer"){
        answer_list.add(set.getString("answer");
    }
    if (set.has("imgUrl"){
        image_list.add(set.getString("imgUrl");
    }
    if (set.has("id"){
        question_batch.add(set.getInt("id");
    }

    i++;

    }else{
        continue = false;
    }
}

这样效率更高一点,因为您不必每次想要提取数据时都创建新的 JSON 对象。 此外,我会创建一个新类来处理 JSON 对象,并创建该类型的数组列表,因此您只需为每次迭代添加一个对象。这样,您可以确保您的问题/答案/imageURLs/id 都保存在一起。像这样:

JSONObject set = result.get("set" + i.toString());

QuestionObject newQuestion = new QuestionObject();

if (set.has("title"){
    newQuestion.setTitle(result.getString("title");
}
if (set.has("answer"){
    newQuestion.setAnswer(result.getString("answer");
}
if (set.has("imgUrl"){
    newQuestion.setImageURL(result.getString("imgUrl");
}
if (set.has("id"){
    newQuestion.setID(result.getInt("id");
}

questionList.add(newQuestion);

另外,如果您没有注意到,您可以使用 json.getInt() 直接解析整数,而不是字符串。

【讨论】:

  • 是的,我在我的实际代码中使用它来解析 Int,只是我在这里犯了一个错字,不过谢谢你指出来
【解决方案2】:

您可能还想看看杰克逊。这也很简单,您的代码可能会从使用它中受益。

【讨论】:

    猜你喜欢
    • 2014-10-18
    • 1970-01-01
    • 2015-08-05
    • 2015-08-14
    • 2013-10-02
    • 1970-01-01
    • 2015-05-11
    • 2011-11-14
    • 1970-01-01
    相关资源
    最近更新 更多