org.json.simple.JSONArray设计不佳吗?

时间:2014-11-14 18:20:31

标签: java json generics

我从https://stackoverflow.com/a/20445493/2848676知道以下代码提供错误type mismatch cannot convert from element type object to string

ArrayList objectArray = new ArrayList();
for (String str : objectArray) {

编译器在我的objectArray声明中给出了警告ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized。这对我来说都很有意义。修复是指定泛型类型:

ArrayList<String> stringArray = new ArrayList<String>();
for (String str : stringArray) {

这可以避免编译器警告和编译错误。

我的问题是,我正在尝试迭代一个名为org.json.simple.JSONArray的ArrayList的子类,而我无法控制如何实例化JSONArray。因此我没有在任何地方看到编译器警告,但我在这个for循环代码行中得到了编译错误:

JSONArray insights = (JSONArray)jsonResult.get("insights");
for (JSONObject insightGroup : insights) {

我知道我可以这样解决这个问题:

JSONArray insights = (JSONArray)jsonResult.get("insights");
for (int i=0; i<insights.size(); i++) {
    JSONObject insightGroup = (JSONObject) insights.get(i);

但有人可以解释泛型类型的细节吗?特别是,如何在不指定泛型类型的情况下实例化org.json.simple.JSONArrayorg.json.simple.JSONArray设计得很差吗?或者我没有正确使用org.json.simple.JSONArray

2 个答案:

答案 0 :(得分:2)

  

org.json.simple.JSONArray设计得不好吗?

在我看来,是的,但不是因为你所描述的原因。

JSON数组可以包含任何JSON值类型,而不仅仅是JSON对象。所以

for (JSONObject insightGroup : insights) {
不应该允许

,并且不是。 JSONObject类型表示JSON对象。但JSONArray可以包含String值,其他JSONArray值,数值,null或其他JSONObject值。

JSON格式描述为here

也许这就是JSONArray被实施为扩展和实施原始List类型的原因,which is typically not a good idea.

答案 1 :(得分:1)

是的,看起来JSONArray是一个ArrayList<Object>。尝试创建ArrayList<JSONObject>,如下所示:

// The json-simple way
ArrayList<JSONObject> jsonThings = (JSONArray)JSONValue.parse(jsonString);
for (JSONObject j : jsonThings) {
    System.out.println("This is it:  " + j.toJSONString());
}

或者在这样的地方演出:

for (Object j : jsonThings) { 
    System.out.println("This is it:  " + ((JSONObject)j).toJSONString());
}