gpt4 book ai didi

java - 使用 Jackson 反序列化 Java 数组

转载 作者:行者123 更新时间:2023-12-01 22:27:06 24 4
gpt4 key购买 nike

我正在尝试使用 Jackson 作为通用序列化引擎而不是 Java 序列化。通过以下方式初始化映射器:

objectMapper = new ObjectMapper();
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

所有类型信息都存储在 JSON 中,因此我可以使用以下方式写入和读取所有对象:

objectMapper.readValue(json, Object.class)

当我尝试序列化然后反序列化 java 数组时遇到问题。由于 Jackson 不会将数组类型存储到 JSON 中,因此在反序列化阶段稍后会失败。在下面的代码中:

    String [] strings = {"A", "B", "C"};
try {
String json = objectMapper.writeValueAsString(strings);
String [] stringsBack = (String [])objectMapper.readValue(json, Object.class);
if (!strings.equals(stringsBack)) {
System.err.println("ERROR, stringsBack not the same!!!\n\n");
}
} catch (IOException e) {
e.printStackTrace();
}

json 将设置为“[“A”,“B”,“C”]”,但在反序列化时出现以下异常:

Exception in thread "main" java.lang.IllegalArgumentException: Invalid type id 'A' (for id type 'Id.class'): no such class found
at com.fasterxml.jackson.databind.jsontype.impl.ClassNameIdResolver._typeFromId(ClassNameIdResolver.java:66)
at com.fasterxml.jackson.databind.jsontype.impl.ClassNameIdResolver.typeFromId(ClassNameIdResolver.java:48)
at com.fasterxml.jackson.databind.jsontype.impl.TypeDeserializerBase._findDeserializer(TypeDeserializerBase.java:157)
at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer._deserialize(AsArrayTypeDeserializer.java:94)
at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer.deserializeTypedFromAny(AsArrayTypeDeserializer.java:68)
at com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer$Vanilla.deserializeWithType(UntypedObjectDeserializer.java:494)
at com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:42)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3560)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2576)
at Main.run(Main.java:86)

有没有办法指示 Jackson 将 java 数组类型信息也存储到 JSON 中?我的序列化引擎是通用的,并且事先不知道将从 JSON 字符串中读取的类型。

最佳答案

我目前找到的最佳解决方案是在序列化之前检查对象是否是数组(Class.isArray),然后进行序列化:

TypeReference ref = new TypeReference<List[]>() { };
String json = objectMapper.writerFor(ref).writeValueAsString(strings);

这会将数组类型添加到 JSON 中并允许将其读回。

关于java - 使用 Jackson 反序列化 Java 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28537840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com