我使用JSON simple来解析JSON文件。当我这样做时,我得到JSONArray
。但是当我尝试迭代它并获得它的JSONObject
元素时,我得到一个错误。
这是我的代码:
JSONArray jsonData = (JSONArray) jsonParser.parse(reader);
List<JSONObject> elementsList = new ArrayList<JSONObject>();
for (int i = 1; i < jsonData.size(); i++) {
elementsList.addAll(jsonData.get(i)); // Here jsonData.get(i) is a JSONObject
}
我在Eclipse中遇到以下错误:
不确定这些是什么意思以及如何解决这个问题。
答案 0 :(得分:3)
JSONArray#get(int)
的返回类型为Object
(因为它继承自原始类型ArrayList
)。 List#addAll(Collection)
期望参数类型为Collection
。如果没有类型广告,Object
类型无法转换为Collection
。
但是,即使你要转换get
返回的值,基础值实际上也是JSONObject
,你在运行时得到ClassCastException
。
你想要的是
elementsList.addAll(jsonData); // outside the loop
因为JSONArray
是ArrayList
的子类型,Collection
。您会收到有关jsonData
要求取消选中转换的警告,但您应该很好,假设您JSONObject
内的值实际为JSONArray
。
答案 1 :(得分:0)
正如您所写,json Data.get(i)是一个JSONObject,因此,您无法使用addAll添加它是正常的。
基本上,如果要添加列表,请使用addAll
,如果要添加对象,请使用add
。
您可以使用add
更改代码,使用for循环遍历jsonData。
另一方面,您可以简单地使用elementsList.addAll(jsonData)
答案 2 :(得分:0)
尝试那样。
Public Function checkColor(cell)
If cell.Interior.Color = vbRed Then
checkColor = 200
Else
checkColor = 0
End If
End Function
答案 3 :(得分:0)
问题是,ArrayList.addAll()只接受java.util.Collection类型,不能将JSONObject作为输入参数,
以下是javadoc的摘录,
public boolean addAll(Collection c)
将指定集合中的所有元素按指定集合的Iterator返回的顺序附加到此列表的末尾。如果在操作正在进行时修改指定的集合,则此操作的行为是不确定的。 (这意味着如果指定的集合是此列表,则此调用的行为是未定义的,并且此列表是非空的。)
为了将所有JSONObjects放入列表中,使用如下所述的add方法而不是addAll(),
JSONArray jsonData = (JSONArray) jsonParser.parse(reader);
List<JSONObject> elementsList = new ArrayList<JSONObject>();
for (int i = 1; i < jsonData.size(); i++) {
elementsList.add(jsonData.get(i)); // Here jsonData.get(i) is a JSONObject
}