用于填充Spinner的JSON提取键

时间:2013-10-16 18:07:44

标签: android json spinner

我想在我的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();
                        }
                    }

2 个答案:

答案 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文件中的元素总数。更改是迭代每个父元素(在本例中为CialdaCartone),并为每个元素计算子元素的数量。

修改 根据你的评论,这可以很容易地修改,以计算父母和孩子:

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如下:

JSON

{ "items" : 
  [
    {
      "type" : "food",
      "name" : "Tacos"
    },
    {
      "type" : "food",
      "name" : "Bacon"
    },
    {
      "type" : "food",
      "name" : "Beer"
    },
  ]
}

我会创建以下对象:

Items.java

public class Items {
  List<Item> items;
}

Item.java

public class Item {
  String type;
  String name;
}

然后,我只需执行以下操作即可在获得JSON后创建Items对象。

Items deliciousFoodStuffs = gson.fromJson(json, Items.class);   

这会导致我将我的JSON反序列化为POJO,我可以将其用于我的内容。

让我们说我不想通过字段名称进行映射,而是映射到以不同方式命名的Java字段,我会改为:

Item.java

public class Item {
  @SerializedName("type")
  String typeValue;
  @SerializedName("name")
  String nameValue;
}

使用与之前相同的电话

Items deliciousFoodStuffs = gson.fromJson(json, Items.class);   

我将收到相同的结果,期望我的变量命名不同。

注意:啤酒,培根和炸玉米饼都很美味,不一定按美味顺序组织。