Java Can';t将迭代器.next()结果赋给整数数组元素
我有一个带整数的JSONArray,我想把它们放到我的常规整数数组中。我尝试使用迭代器,但发现异常“class java.lang.Long不能转换为class java.lang.Integer”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
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
allLong
我想这就是它的实现方式。请注意,规范没有说明迭代器返回的对象的实际类型
那么,编写用例的正确方法是什么
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++;
}