2014-11-14 100 views
1

我知道从https://stackoverflow.com/a/20445493/2848676下面的代码给出了错误type mismatch cannot convert from element type object to stringorg.json.simple.JSONArray设计不好?

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) { 

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

我的问题是,虽然我试图遍历ArrayList的一个子类称为org.json.simple.JSONArray,我没有控制如何实例化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.JSONArray如何在不指定泛型的情况下实例化? org.json.simple.JSONArray设计得不好吗?或者我没有正确使用org.json.simple.JSONArray

+1

试想一下,你要使用JSON与下的Java 1.4运行传统应用程序。现在,尝试用java 1.4来解决泛型问题。向后兼容性是一个潜在的原因;我不知道这是否是原因。 – DwB 2014-11-14 18:40:38

回答

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.

+0

我想我刚刚发现如何使用JSON Simple(即org.json.simple)。有一个('ContainerFactory')[https://code.google。com/p/json-simple/wiki/DecodingExamples#Example_4 _-_ Container_factory],它允许您在(Java Collections Framework)中指定类[http://docs.oracle.com/javase/7/docs/technotes/guides/集合/ index.html中]。而且,“如果您没有指定容器工厂,org.json.simple.JSONObject用于Map并且org.json.simple.JSONArray用于List。” – 2015-03-23 17:11:03

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()); 
}