【问题标题】:Is org.json.simple.JSONArray poorly designed? [closed]org.json.simple.JSONArray 是否设计不佳? [关闭]
【发布时间】:2014-11-14 18:20:31
【问题描述】:

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

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

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

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

【问题讨论】:

  • 想象一下,您想将 JSON 与在 java 1.4 下运行的遗留应用程序一起使用。现在,尝试使用 java 1.4 解析泛型。向后兼容是一个潜在的原因;不知道是不是这个原因。

标签: java json generics


【解决方案1】:

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.的原因

【讨论】:

【解决方案2】:

是的,看起来 JSONArray 在幕后是一个 ArrayList&lt;Object&gt;。尝试创建一个ArrayList&lt;JSONObject&gt;,如下所示:

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

【讨论】:

    猜你喜欢
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2010-09-06
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    相关资源
    最近更新 更多