Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在使用Jackson的TypeResolverBuilder时反序列化基元长字段_Java_Json_Serialization_Jackson - Fatal编程技术网

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);
        }

    };