当前位置: 首页 > 知识库问答 >
问题:

JsonMappingException:未实现类型ID处理,使用enableDefaultTyping和自定义序列化器

蒋培
2023-03-14

我使用Java 9、Jackson core和Jackson databind 2.5.5,我希望使用DefaultTyping的自定义序列化。用于在Json中写入类名的非\u FINAL选项。

如果我删除默认的键入NON\u FINAL,一切都会正常。

当我添加NON\u FINAL选项时,我的自定义序列化程序“MySerializer”被调用,我有一个异常JsonMappingException:未实现类型id处理

public class Main {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.enableDefaultTyping();
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(new MySerializer());

        objectMapper.registerModule(simpleModule);

        System.out.println(objectMapper.writeValueAsString(new MyObject(1)));
    }
}

public class MyObject {
    private int a = 0;

    public MyObject() {
    }

    public MyObject(int a) {
        this.a = a;
    }

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }
}

public class MySerializer extends StdSerializer<MyObject> {
    protected MySerializer() {
        super(MyObject.class);
    }

    public void serialize(MyObject myObject, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeStartObject();
        jsonGenerator.writeNumberField("newNameForFieldA", myObject.getA());
        jsonGenerator.writeEndObject();
    }
}


    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.5.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.5.5</version>
        </dependency>
    </dependencies>

没有默认键入NON_FINAL结果:

{"newNameForFieldA": 1}

例外情况:

线程“main”_configAndWriteValueJsonMappingException中的异常:类型2. M2未实现类型id处理。MyObject(通过类型ain.java:182的序列化器)com.fasterxml.jackson.databind.SerializerProvider.mappingException(SerializerProvider.java:1047)com.fasterxml.jackson.databind.JsonSerializer.serialize在com.fasterxml.jackson.databind.ser.impl.TypeWrappeSerializer.serialize(TypeWrappeSerializer.java:32)com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serialize值(DefaultSerializerProvider.java:129)在com.fasterxml.jackson.databind.ObjectMapper。com.test.jackson.main(ObjectMapper.java:3387)com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:2781)在com.fasterxml.jackson.databind.com.test.jackson.main(Mcom.test.jackson.main)

共有1个答案

沈宏朗
2023-03-14

默认键入时。如果启用NON\u FINAL,则如果定义了自定义序列化程序,objectMapper将使用类“JsonSerializer”中定义的方法“serializeWithType”来执行序列化操作。

因此,要解决这个问题,需要重写方法“serializeWithType”。

 类似资料:
  • 我在序列化Jackson中的泛型对象时遇到问题。我已经找到了一个解决方法,但我仍然不知道为什么我原来的解决方案不起作用。以下是我的设置: 以下是我当前用于序列化方法的代码: 以下是应该起作用但不起作用的: 对于第二种情况,我得到了以下例外: 这是什么原因?从ClassB中的类型规范可以清楚地看出,列表中只能使用ParamClass,不能使用BaseParamClass。我错过什么了吗?

  • 我有一个JSON作为字符串,我将其反序列化并实例化为scala的MyPOJO case类。我的数据是YYYY-MM-DD格式,但POJO createdBy中的实际属性是LocalDateTime。 如何在实例化Pojo时指定默认时间值2020-03-02 00:00:00, 序列化应返回yyyy-mm-dd格式。我的序列化和反序列化格式不同。 我尝试过自定义序列化和反序列化,如下所示,但由于缺少

  • 本文向大家介绍Java使用@JsonDeserialize注解实现自定义反序列化器,包括了Java使用@JsonDeserialize注解实现自定义反序列化器的使用技巧和注意事项,需要的朋友参考一下 @JsonDeserialize注解用于在将JSON反序列化为Java对象时声明自定义反序列化器。我们可以通过使用泛型类型Employee 继承 StdDeserializer 类来实现自定义反序列化

  • 我目前正在将一些代码从Jackson1.x迁移到Jackson2.5json映射器,遇到了一个1.x中没有的问题。 这是设置(参见下面的代码): 接口IPET 类Dog实现IPET IPET使用@jsonTypeInfo和@jsonSubtypes进行注释 类Human具有一个类型为IPet的属性,该属性使用@JSONSerialize(using=CustompetSerializer.clas

  • 我有一个不能用Gson正确序列化的类(类只是name和HashMap),所以我编写了一个自定义序列化程序来从HashMap中打印名称和键值对。 此外,这是实际打印的内容,序列化整个对象并不像我所期望的那样工作,也不只是直接打印对象。 任何帮助都将不胜感激。

  • 有没有一种方法可以指定不同的序列化/反序列化JSON字段名,而不必显式地写出getter和setter方法,或许可以使用lombok getter和setter? 与此示例类似,下面的代码允许将传入的JSON反序列化为不同的POJO字段名。它还会使POJO字段名序列化为: 但这当然是不成立的。