Java Can';t将迭代器.next()结果赋给整数数组元素

Java Can';t将迭代器.next()结果赋给整数数组元素,java,json,Java,Json,我有一个带整数的JSONArray,我想把它们放到我的常规整数数组中。我尝试使用迭代器,但发现异常“class java.lang.Long不能转换为class java.lang.Integer” objectobj=parser.parse(新文件读取器(setingsfilename)); JSONObject JSONObject=(JSONObject)对象; int[]dataGrid=newint[11]; int i=0; JSONArray msg=(JSONArray)jso

我有一个带整数的JSONArray,我想把它们放到我的常规整数数组中。我尝试使用迭代器,但发现异常“class java.lang.Long不能转换为class java.lang.Integer”

objectobj=parser.parse(新文件读取器(setingsfilename));
JSONObject JSONObject=(JSONObject)对象;
int[]dataGrid=newint[11];
int i=0;
JSONArray msg=(JSONArray)jsonObject.get(“数据”);
迭代器迭代器=msg.Iterator();
while(iterator.hasNext()){
dataGrid[i]=迭代器.next().intValue();
i++;
}
为什么会这样?我只创建了整数迭代器,而不是长迭代器

更新

这是Jsonatay的内容

这是形成文件的代码

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();
}
int[]dataGrid=newint[11];

对于(inti=0;i而言,从JSON读取的值大于Integer类型的有效限制。这就是Java转换为Long而不是Integer的原因

如果您正在猜测该整数限制是什么,则它在中定义,并且是(2^31)-1

还要注意
intValue()
,因为如果值大于整数的限制,它将截断或舍入该值

关于你的疑问:

为什么会这样?我只创建了整数迭代器,不长 互动者


这是因为迭代器在您对其执行
next()
之前不知道内容的类型(在定义迭代器时预先迭代内容,然后在使用迭代器时再次迭代是没有意义的).

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

  • 对象的类型为
    Long
  • 这些引用是调试器遇到的第2703个对象引用
  • 对对象调用
    toString()
    的结果是
    “1”
因此,发生的情况是,您的
next()
调用返回应用程序试图转换为
Integer
Long
对象,但由于无法将
Long
转换为
Integer
,因此失败


为什么它要尝试那个演员阵容?(你没有写演员阵容!)

这是因为您声明了迭代器,如下所示:

Iterator<Integer> iterator
我正在查看的
json.org.JSONArray版本将
iterator()
声明为
iterator iterator()
。但是如果没有(未选中!)类型转换,您不能将
iterator
分配给
iterator`,并且代码中没有类型转换。)


为什么
JSONArray
all
Long

我想这就是它的实现方式。请注意,规范没有说明迭代器返回的对象的实际类型


那么,编写用例的正确方法是什么

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++;
}
objectobj=parser.parse(新文件读取器(setingsfilename));
JSONObject JSONObject=(JSONObject)对象;
int[]dataGrid=newint[11];
int i=0;
JSONArray msg=(JSONArray)jsonObject.get(“数据”);
迭代器迭代器=msg.Iterator();
while(iterator.hasNext()){
Number num=(Number)(迭代器.next());
dataGrid[i]=number.intValue();
i++;
}
无论JSONArray使用哪个
Number
子类来表示数组值,这都将起作用


请注意,序列化JSON时使用的整数类型并不重要。该类型信息未在JSON中编码。

看起来您的JSONArray包含的长值不是整数`dataGrid[i]=((长)迭代器.next()).intValue();`尝试此操作,但数组中存在整数值!请看一下问题中的更新。JSONArray中有整数。@Eluv-您的屏幕截图显示它们是
Long
对象。就像帕科说的,好吧,我明白了。但是谁能告诉我为什么它们很长?我粘贴的代码显示,我把值像整数。
 Iterator<Integer> iterator = msg.iterator();
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++;
}