无法将iterator.next()结果分配给整数数组元素

时间:2019-04-06 10:52:52

标签: java json

我有带整数的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的内容。

enter image description here

这是构成文件的代码。

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。

2 个答案:

答案 0 :(得分:1)

首先,请仔细查看JSONArray的调试器输出。请注意,它将元素显示为"{Long@2703} 1"。这意味着:

  • 对象的类型为Long
  • 引用是调试器遇到的2703'rd对象引用
  • 在对象上调用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()为止,迭代器才知道内容的类型(在定义迭代器时先迭代内容,然后在使用它时再重复一次是毫无意义的)。