如何解析json字符串中的内部数组?

时间:2009-12-14 12:22:18

标签: json blackberry

{"genres":[{"total_genres":"2"},{"genre":[{"code":"CTY","name":"Country"}]},{"genre":[{"code":"HOP","name":"Hip Hop / R&B"}]}]}

我试着从这个字符串中解析内部数组“genre”。 如果我这样做,我可以得到一个外部数组“类型”:

JSONObject outer=new JSONObject(returnContent);

JSONArray ja = outer.getJSONArray(“genres”);

如何提取内部对象?

1 个答案:

答案 0 :(得分:3)

你必须遍历数组。假设blackberry的JSONArray像java等价物一样(或者是java?):

for(int i = 0; i < ja.size(); i++) {
    JSONObject inner = ja.get(i);
}

至于你自己的JSON,我会说人们希望“流派”成为一系列流派。现在它是一个流派数组+一个包含流派计数的对象。这将完全奏效,我想在某些方面,JSON的优点在于你可以用它做你想做的事情,但这是非常不可预测的,你必须修改你的代码以适应它。例如,在上面的示例中,您不应该以{{1​​}}开头,而应该i = 0直接跳到实际类型。但我宁愿改变JSON,就像这样:

i = 1

现在,看看你的个人类型。 “类型”是一个对象数组。每个对象只有一个属性“genre”,它本身包含一个数组。每个数组只包含一个项目,该项目是包含代码和名称的对象。在我看来,这似乎是一个冗余的包装。要提取代码和名称,您必须执行以下操作:

{"total_genres":"2", "genres":[{"genre":[{"code":"CTY","name":"Country"}]},{"genre":[{"code":"HOP","name":"Hip Hop / R&B"}]}]}

但我宁愿不采取这种方法。如果你能改变你的JSON就会更清洁:

for(int i = 1; i < ja.size(); i++) {
    JSONObject inner = ja.get(i);
    JSONArray innerArray = inner.getJSONArray("genre");
    JSONObject evenFurtherInner = innerArray.get(0);

    String code = evenFurtherInner.getString("code");
}

然后你可以做

{"total_genres":"2", "genres":[{"code":"CTY","name":"Country"},{"code":"HOP","name":"Hip Hop / R&B"}]}

请注意for(int i = 0; i < ja.size(); i++) { JSONObject genre = ja.get(i); String code = genre.getString("code"); } 的使用。由于您的所有类型都在一个数组中,您只需检查数组的大小,而不必在返回的代码中添加额外的计数器。因此,为了获得最佳可读性,您实际上可以进一步降低JSON:

ja.size()