施展双倍到长,奇怪的例外

时间:2015-08-26 19:48:45

标签: java json casting

我正在使用org.json.simple解析JSON文件,并且我发现了一个错误,这让我感到沮丧,我无法修复它。希望您能够帮助我。 问题是,使用此代码会出现以下异常java.lang.Double cannot be cast to java.lang.Long "怪异的"事情是,如果我改变"双变量"到"长变量",出现以下错误:java.lang.Long cannot be cast to 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
},
]
}

感谢您的时间!

2 个答案:

答案 0 :(得分:2)

JSONObject实际上是HashMap,可能包含不同类型的值。

显然,get()循环中针对数组分配的4次调用可能会返回while个对象(NumberLong并且Double中不允许在这些类型中进行投射。

所以,需要的是像

这样的简单辅助函数
Java

其中-1表示无效值(当然可以是其他任何值)。使用 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); } 应该足够快,并且还涵盖instanceof个值,从而避免使用null

如果要分配的所有数组值均为NullPointerExceptions,则后3个分配需要调用long。如果所有数组值均为longValue(),则使用double作为第一个赋值应该可以正常工作,即

doubleValue()

出于安全原因,请更好地使用this.humOWaux[i] = doubleValue(uj.get("humidity")); longValue()进行所有分配。

答案 1 :(得分:1)

我认为您的问题在于您无法将包装器直接从一种类型转换为另一种类型。这种转换仅允许使用基元,如Java SE Specifications, Chapter 5. Conversions and Promotions中所示。

我尝试使用Double.longValue()而不是直接投射。