我正在使用 org.json.simple 解析 JSON 文件,但出现了一个令我恼火的错误,而且我无法修复它。希望你能帮我。
问题是,此代码出现以下异常 java.lang.Double 无法转换为 java.lang.Long
“奇怪”的是,如果我将“双变量”更改为“长变量”,则会出现以下错误: java.lang.Long 无法转换为 java.lang.Double
。
你能帮我吗?
private double[] tminOWaux = new double[7];
private double[] tmaxOWaux = new double[7];
private double[] humOWaux = new double[7];
private double[] windOWaux = new double[7];
public void filtraOW7days(String contenidoOW) throws ParseException{
JSONParser parser = new JSONParser();
try{
Object obj = parser.parse(contenidoOW);
JSONObject jsonList = (JSONObject) obj;
JSONArray list = (JSONArray) jsonList.get("list");
Iterator<String> unitsIterator = list.iterator();
int i = 0;
while(unitsIterator.hasNext()){
Object uJson = unitsIterator.next();
JSONObject uj = (JSONObject) uJson;
this.humOWaux[i] = (double) uj.get("humidity");
this.windOWaux[i] = (double) uj.get("speed");
JSONObject slideContent = (JSONObject) uj.get("temp");
this.tmaxOWaux[i] = (double) slideContent.get("max");
this.tminOWaux[i] = (double) slideContent.get("min");
i++;
}
} catch (ParseException e) {
e.printStackTrace();
}
}
JSON 是:
{
"city":{
"id":2643743,
"name":"London",
"coord":{
"lon":-0.12574,
"lat":51.50853
},
"country":"GB",
"population":0
},
"cod":"200",
"message":0.0217,
"cnt":7,
"list":[
{
"dt":1440590400,
"temp":{
"day":18.89,
"min":15.64,
"max":18.89,
"night":15.64,
"eve":18.89,
"morn":18.89
},
"pressure":1008.2,
"humidity":97,
"weather":[
{
"id":501,
"main":"Rain",
"description":"moderate rain",
"icon":"10d"
}
],
"speed":4.37,
"deg":229,
"clouds":76,
"rain":5.8
},
]
}
感谢您的宝贵时间!
最佳答案
JSONObject
实际上是一个 HashMap
,可能具有不同类型的值。
显然,在 while
循环中对 get()
进行 4 次调用以进行数组赋值可能会返回一个 Number
对象(可以是 Long
或 Double
),并且 Java
中不允许在这些类型之间进行转换。
因此,需要的是一个简单的辅助函数,例如
private static long longValue(Object value) {
return (value instanceof Number ? ((Number)value).longValue() : -1);
}
private static double doubleValue(Object value) {
return (value instanceof Number ? ((Number)value).doubleValue() : -1.0);
}
其中 -1 表示无效值(当然可以是其他值)。使用 instanceof
应该足够快,并且它还覆盖 null
值,从而避免 NullPointerExceptions
。
如果要赋值的数组值都是long
,则后3次赋值需要调用longValue()
。如果所有数组值都是 double,则第一次赋值时使用 doubleValue() 应该可行,即
this.humOWaux[i] = doubleValue(uj.get("humidity"));
不过,出于安全原因,最好对所有赋值使用 longValue()
或 doubleValue()
(如果适用)。
关于java - 将 double 强制转换为 long,奇怪的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32235460/