我使用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)
默认键入时。如果启用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字段名序列化为: 但这当然是不成立的。