Java 在使用Jackson的TypeResolverBuilder时反序列化基元长字段
运行以下测试应用程序时Java 在使用Jackson的TypeResolverBuilder时反序列化基元长字段,java,json,serialization,jackson,Java,Json,Serialization,Jackson,运行以下测试应用程序时 import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jack
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) throws IOException {
// Create test data
Data data = new Data();
data.key = 1;
Map<String, Object> mapData = new HashMap<>();
mapData.put("longInMap", 2L);
mapData.put("longAsField", data);
// Configure Jackson to preserve types
JsonFactory factory = new JsonFactory();
ObjectMapper mapper = new ObjectMapper(factory);
StdTypeResolverBuilder resolver = new StdTypeResolverBuilder();
resolver.init(JsonTypeInfo.Id.CLASS, null);
resolver.inclusion(JsonTypeInfo.As.PROPERTY);
resolver.typeProperty("__t");
mapper.setDefaultTyping(resolver);
mapper.enable(SerializationFeature.INDENT_OUTPUT);
// Serialize
String json = mapper.writeValueAsString(mapData);
System.out.println("json = " + json);
// Deserialize
Map deserializedData = mapper.readValue(json, Map.class);
}
static class Data {
public long key;
}
}
我试图从我们正在使用的库中序列化一组基本的普通旧java对象(因此我们不能修改类或添加注释),同时还试图保留集合中的值类型(“上面示例中的longInMap”必须是一个长对象)
问题是Jackson在尝试反序列化数据
类中的原语公共长密钥
时抛出上述异常。如果我将类型更改为public int key
,则不会引发异常,反序列化工作正常
此外,由于存在许多不同类型的对象,并且我不知道在编译时将序列化哪些对象,因此我认为使用mix-ins不起作用
请说明我可能做错了什么,或者提供一种可能的解决方法,以便在反序列化基本长字段的同时维护集合中的对象类型
我正在使用Jackson 2.8.3。这里提供了一个解决方案 解决办法是替换
StdTypeResolverBuilder resolver = new StdTypeResolverBuilder();
与
stdtypesolverbuilder解析器=新stdtypesolverbuilder(){
@凌驾
公共类型序列化程序buildTypeSerializer(SerializationConfig配置、JavaType基类型、集合子类型){
if(baseType.isPrimitive()){
返回null;
}
返回super.buildTypeSerializer(配置、基类型、子类型);
}
@凌驾
公共类型反序列化器buildTypeDeserializer(反序列化配置、JavaType基类型、集合子类型){
if(baseType.isPrimitive()){
返回null;
}
返回super.buildTypeDeserializer(配置、基类型、子类型);
}
};
jackson databind 2.8.4中已经实施了一个修复程序,之后将不再需要该解决方案。此处提供了一个解决方案 解决办法是替换
StdTypeResolverBuilder resolver = new StdTypeResolverBuilder();
与
stdtypesolverbuilder解析器=新stdtypesolverbuilder(){
@凌驾
公共类型序列化程序buildTypeSerializer(SerializationConfig配置、JavaType基类型、集合子类型){
if(baseType.isPrimitive()){
返回null;
}
返回super.buildTypeSerializer(配置、基类型、子类型);
}
@凌驾
公共类型反序列化器buildTypeDeserializer(反序列化配置、JavaType基类型、集合子类型){
if(baseType.isPrimitive()){
返回null;
}
返回super.buildTypeDeserializer(配置、基类型、子类型);
}
};
已实施修复,将在jackson databind 2.8.4中提供,此后不再需要解决方案
StdTypeResolverBuilder resolver = new StdTypeResolverBuilder() {
@Override
public TypeSerializer buildTypeSerializer(SerializationConfig config, JavaType baseType, Collection<NamedType> subtypes) {
if (baseType.isPrimitive()) {
return null;
}
return super.buildTypeSerializer(config, baseType, subtypes);
}
@Override
public TypeDeserializer buildTypeDeserializer(DeserializationConfig config, JavaType baseType, Collection<NamedType> subtypes) {
if (baseType.isPrimitive()) {
return null;
}
return super.buildTypeDeserializer(config, baseType, subtypes);
}
};