我想在我的JSON文件中将密钥“desc”和“type”提取到两个单独的数组中。 我从ftp站点获取文件,我不知道有多少条目。 在我拥有String数组之后,我想用“desc”值填充Spinner。 怎么办?
这是我的JSON文件
{
"Pagnerine":[{
"Cialda":[{
"userId":1,
"desc":"Sottozero/Estate",
"type":"ct"
},
{
"userId":2,
"desc":"Piccolo/Primavera",
"type":"ct"
},
{
"userId":3,
"desc":"Medio",
"type":"ct"
},
{
"userId":4,
"desc":"Grande",
"type":"ct"
}
],
"Cartone":[{
"userId":1,
"desc":"16B",
"type":"ct"
},
{
"userId":2,
"desc":"17",
"type":"ct"
},
{
"userId":3,
"desc":"34",
"type":"ct"
},
{
"userId":4,
"desc":"20",
"type":"ct"
}
]
}
],
"Cucchiaini":[],
"Vaschette":[],
"Zuccheri":[],
"versione":"100"
}
我试图实现此代码以获取有多少条目(desc或类型),但失败因为只计算第一部分“Cialda”和“Cartone “
Iterator<String> iter = jObj.keys();
while (iter.hasNext()) {
String key = iter.next();
try {
JSONArray jArray = jObj.getJSONArray(key);
// looping through
entry += jArray.length();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
答案 0 :(得分:1)
您发布的代码与问题中的目标不符。但要回答为什么entry
仅计算前两个元素(并假设jObj是包含JSONObject
元素的有效Pagnerine
)的问题,请尝试以下方法:
for(int i = 0; i < jObj.length(); i++) {
JSONObject childObject = new JSONObject(jObj.get(i).toString());
entry += childObject.length();
}
entry
现在应该包含JSON文件中的元素总数。更改是迭代每个父元素(在本例中为Cialda
和Cartone
),并为每个元素计算子元素的数量。
修改强> 根据你的评论,这可以很容易地修改,以计算父母和孩子:
for(int i = 0; i < jObj.length(); i++) {
parentCount += jObj.length();
JSONObject childObject = new JSONObject(jObj.get(i).toString());
childCount += childObject.length();
}
答案 1 :(得分:1)
我建议为此实施一个更易于维护的解决方案,以便您可以将其变为易于使用的POJO并在以后适应潜在的变化。我首选的方法是使用[GSON}(https://code.google.com/p/google-gson/),但也有Jackson。
查看GSON User Guide的详细信息,但基本上就是这个概念。
让我们说我的JSON如下:
{ "items" :
[
{
"type" : "food",
"name" : "Tacos"
},
{
"type" : "food",
"name" : "Bacon"
},
{
"type" : "food",
"name" : "Beer"
},
]
}
我会创建以下对象:
public class Items {
List<Item> items;
}
public class Item {
String type;
String name;
}
然后,我只需执行以下操作即可在获得JSON后创建Items对象。
Items deliciousFoodStuffs = gson.fromJson(json, Items.class);
这会导致我将我的JSON反序列化为POJO,我可以将其用于我的内容。
让我们说我不想通过字段名称进行映射,而是映射到以不同方式命名的Java字段,我会改为:
public class Item {
@SerializedName("type")
String typeValue;
@SerializedName("name")
String nameValue;
}
使用与之前相同的电话
Items deliciousFoodStuffs = gson.fromJson(json, Items.class);
我将收到相同的结果,期望我的变量命名不同。
注意:啤酒,培根和炸玉米饼都很美味,不一定按美味顺序组织。