java - 将 double 强制转换为 long,奇怪的异常

标签 java json casting

我正在使用 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 对象(可以是 LongDouble),并且 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/

相关文章:

php - 将用户输入转换为足以对其进行清理的整数吗?

java - 转换为 Message 数组

java - 集合 <接口(interface)> 名称 = null;

json - Ember-cli-dependency-checker - 无效版本 : *

javascript - Ext Js面板空时间字段

android - 使用 DEFAULT_SERIALIZE_NULLS 值时不会跳过 Retrofit2/Gson 空值

从 double 到 const int 的 C++ 类型转换不能正常工作

java - 如何在android studio中添加图像文件并获取其uri?

java - 安卓NDK : load_library: cannot locate srand

java - Android - RFID 的 EPC 十六进制银行充满空值