{"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”);
如何提取内部对象?
答案 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()