![](/img/trans.png)
[英]Deserialize JSON array in a deserialized JSON array using Jackson
[英]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 User
是JsonNode
,如下所示:
{
"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.