繁体   English   中英

不能使用 jackson 强制转换反序列化的 json 数组

[英]Can not cast deserialized json array with jackson

我正在使用 java 中的 jackson lib 将 json 文件反序列化为数组列表。 首先,我使用这种方法,一切正常。

ObjectMapper objectMapper = new ObjectMapper();
ArrayList<User> users = (ArrayList<User>) objectMapper.readValue(new File("data.json"), new TypeReference<List<User>>() {});

然后我决定重构代码并编写一个通用方法来用于任何类型的数据。

public static <T> ArrayList<T> listFromJson(String filename) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        return (ArrayList<T>) objectMapper.readValue(new File(filename), new TypeReference<List<T>>() {});
}

此方法返回数组列表,没有任何异常。 但是当我想使用 arraylist 的元素并将其存储在变量中时,程序会抛出这样的异常。

User user = users.get(0);
Exception in thread "main" java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class org.example.User ...
    ....

我还尝试在不强制转换的情况下打印出元素,它不是 object 参考。 它类似于 hashmap。

我认为它与 generics 有关,但我不知道原因。 谢谢你的帮助。

您的 object UserJsonNode ,如下所示:

{
   "userName": "...",
   "email": "...",
   etc.
}

虽然这个 object 可以映射到一个User.class如果你指定的话,当你什么都不说的时候,唯一的猜测是 Jackson 可以采取的是,这是一个LinkedHashMap ,ObjectMap Map<String, Object>和实现map 尊重其插入顺序)。

因此,当您重构方法时:

public static <T> ArrayList<T> listFromJson(String filename) throws IOException {
    ObjectMapper objectMapper = new ObjectMapper();
    return (ArrayList<T>) objectMapper.readValue(new File(filename), new TypeReference<List<T>>() {});
}

...您对 Jackson 说,它会找到一个List<T> ,其中T可以是任何 object。 唯一可以猜测的是它将是一个 JsonNode (因此是Map.class )。

要解决此问题,您还应该将具体的TypeReference传递给该方法:

public static <T> ArrayList<T> listFromJson(String filename, TypeReference<?> expectedTypeReference) throws IOException {
    ObjectMapper objectMapper = new ObjectMapper();
    return (List<T>) objectMapper.readValue(new File(filename), expectedTypeReference);
}

...并像这样使用它:

TypeReference<List<User>> expectedTypeRef = new TypeReference<>() {};
List<User> users = listFromJson(fileName, expectedTypeRef);
User user = users.get(0); // <-- this should work

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM