有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在Java中解码用GSON创建的JSON文件?

我已经用gson成功地创建了一个JSON文件,但是现在我想解析同一个文件,所以编码变得一团糟

这是我用来读取JSON文件的代码:

BufferedReader jsonFile = new BufferedReader(new FileReader("file.json"));
Map<String, List<long[]>> trafficInput = new HashMap<>();
trafficInput = gson.fromJson(jsonFile, HashMap.class);

我似乎不知道如何确保文件得到正确的解析

例如,此文件中的有效JSON代码:

{"paris":[[1485907200000,182184411,41274],[1485993600000,151646118,36697],"london":[[1485907200000,30200160,155827]}

。。。按如下方式进行分析:

{"paris":[[1.4859072E12,1.82184411E8,41274.0],[1.4859936E12,1.51646118E8,36697.0],"london":[[1.4859072E12,3.020016E7,155827.0]}

这将打乱代码的其余部分,因为long不再是long了

例如,如果我尝试打印一个值,如下所示:

System.out.println(trafficInput.get("paris").get(0)[0]);

。。。我得到这个错误:

Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList cannot be cast to [J

有什么帮助吗


共 (1) 个答案

  1. # 1 楼答案

    发生这种情况的原因如下:

    trafficInput = gson.fromJson(jsonFile, HashMap.class);
    

    此行指示gson将字符串反序列化为HashMap,而不指定任何类型,因此gson应用其默认转换机制(即将Number转换为double等)。这就是Sysout语句导致ClassCastException的原因,因为该元素不是array

    您所需要做的就是在调用fromJson方法时指定一个TypeToken,它将处理类型。e、 g:

    Gson gson = new Gson();
    Type type = new TypeToken<Map<String, List<long[]>>>(){}.getType();
    Map<String, List<long[]>> trafficInput = new HashMap<>();
    trafficInput = gson.fromJson("{\"paris\":[[1485907200000,182184411,41274],[1485993600000,151646118,36697]],\"london\":[[1485907200000,30200160,155827]]}", type);
    System.out.println(trafficInput);
    System.out.println(gson.toJson(trafficInput));
    

    上面的代码片段不使用科学符号打印数字