我有带整数的JSONArray,我想获取并将其放入我的常规整数数组中。我尝试使用Iterator,但遇到了异常“类java.lang.Long无法强制转换为类java.lang.Integer”。
Object obj = parser.parse(new FileReader(settingsFileName));
JSONObject jsonObject = (JSONObject) obj;
int[] dataGrid=new int [11];
int i=0;
JSONArray msg = (JSONArray) jsonObject.get("data");
Iterator<Integer> iterator = msg.iterator();
while (iterator.hasNext()){
dataGrid[i]=iterator.next().intValue();
i++;
}
为什么会这样?我只创建了Integer Iterator,而不是Long Interator。
更新
这是JSONAttay的内容。
这是构成文件的代码。
int[] dataGrid=new int [11];
for (int i=0;i<11;i++)
dataGrid[i]=1;
JSONObject obj=new JSONObject();
JSONArray numbers=new JSONArray();
for (int i=0;i<11;i++)
numbers.add(dataGrid[i]);
obj.put("data",numbers);
obj.put("portName",portName);
FileWriter out=new FileWriter(file);
try{
out.write(obj.toJSONString());
}
finally {
out.close();
}
我放置了整数值,但是不知何故它们变成了long。
答案 0 :(得分:1)
首先,请仔细查看JSONArray
的调试器输出。请注意,它将元素显示为"{Long@2703} 1"
。这意味着:
Long
toString()
的结果是"1"
。因此,正在发生的情况是您的next()
调用返回了Long
个对象,您的应用程序试图将这些对象强制转换为Integer
...并且由于无法转换{{1} }到Long
。
为什么要尝试投射? (您没有撰写演员表!)
这是因为您声明了迭代器,如下所示:
Integer
因此,当您调用Iterator<Integer> iterator
时,编译器会将结果的隐式类型转换添加到迭代器类型的通用参数类型:next()
。
(实际上,对此有些怀疑。如果您使用的是标准Integer
API,则不应编译。
org.json
Iterator<Integer> iterator = msg.iterator();
iterator()json.org.JSONArray that I am looking at declares
Iterator iterator()as
Iterator . But you can't assign
Iterator`的版本,没有(未经检查!)类型转换,并且没有类型转换。您的代码。)
为什么to
的元素全部为JSONArray
?
我想这就是它的实现方式。请注意,规范并未说明迭代器返回的对象的实际类型。
那么编码用例的正确方法是什么?
Long
无论JSONArray使用哪个Object obj = parser.parse(new FileReader(settingsFileName));
JSONObject jsonObject = (JSONObject) obj;
int[] dataGrid = new int[11];
int i = 0;
JSONArray msg = (JSONArray) jsonObject.get("data");
Iterator<Object> iterator = msg.iterator();
while (iterator.hasNext()) {
Number num = (Number) (iterator.next());
dataGrid[i] = number.intValue();
i++;
}
子类来表示数组值,这都将起作用。
请注意,序列化JSON时使用哪种整数类型都没有关系。该类型信息未在JSON中编码。
答案 1 :(得分:0)
从JSON读取的值大于Integer类型的有效限制。因此,Java转换为Long而不是Integer。
如果您猜测整数限制是什么,它在documentation中定义,为(2 ^ 31)-1
还请注意intValue()
,因为如果它大于整数的限制,它将截断或舍入该值。
关于您的疑问:
为什么会这样?我只创建了Integer Iterator,而不是Long 插入器。
这是因为直到对迭代器执行next()
为止,迭代器才知道内容的类型(在定义迭代器时先迭代内容,然后在使用它时再重复一次是毫无意义的)。