我正在使用杰克逊2.x进行序列化和反序列化。我将objectMapper注册到afterBurner模块,并配置了对象映射器以忽略未知属性
objectMapper.registerModule(new AfterBurnerModule());
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Run Code Online (Sandbox Code Playgroud)
但是,当它尝试序列化对象时,它会失败,并发现属性错误的未知字段
java对象也用@JsonIgnoreProperties注释(ignoreUnknown = true)
有人可以帮助我了解可能出了什么问题吗
以下是实用程序类
package example;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.AnnotationIntrospector;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
import com.fasterxml.jackson.module.afterburner.AfterburnerModule;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
public final class Util {
private static ObjectMapper objectMapper;
static {
objectMapper = new ObjectMapper();
objectMapper.registerModule(new AfterburnerModule());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
objectMapper.setDateFormat(sdf);
objectMapper.setAnnotationIntrospector(AnnotationIntrospector.pair(new JaxbAnnotationIntrospector(objectMapper.getTypeFactory()), new JacksonAnnotationIntrospector()));
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.setSerializationInclusion(Include.NON_NULL);
}
private Util() {
}
public static <T> T convertToObject(String jsonString,Class<T> classType){
T obj = null;
try {
obj = objectMapper.readValue(jsonString, classType);
} catch (Exception e) {
}
return obj;
}
public static String convertToString(Object obj)
throws IOException {
return objectMapper.writeValueAsString(obj);
}
}
Run Code Online (Sandbox Code Playgroud)
枚举类NumberEnum
package sample;
public enum NumberEnum {
ONE, TWO
}
Run Code Online (Sandbox Code Playgroud)
A级
package sample;
@JsonIgnoreProperties(ignoreUnknown = true)
public class A {
@JsonProperty
private NumberEnum number;
}
Run Code Online (Sandbox Code Playgroud)
我反序列化的代码如下
A a = Util.convertToObject(str, A.class);
Run Code Online (Sandbox Code Playgroud)
和我想反序列化的字符串如下:
{
"number": "Num"
}
Run Code Online (Sandbox Code Playgroud)
以下是反序列化时的错误:
com.fasterxml.jackson.databind.exc.InvalidFormatException:无法从字符串值'Num'构造sample.NumberEnum的实例:值不是声明的Enum实例名称之一:[一,二]位于(通过参考链:sample.A [“ a”]-> sample.NumberEnum [“ number”])
A类是从jar导入的,并且使用杰克逊库1.9
ignoreUnknown
仅适用于目标对象中未知的属性名称。例如,如果您有:
{
"number": "ONE",
"foo": "bar"
}
Run Code Online (Sandbox Code Playgroud)
如果您要反序列化的对象没有名为“ foo”的设置器/属性,Jackson通常会失败。
您想要实现的目标完全不同;该属性是已知的,但是您正在尝试处理无效的枚举值。如果只想将未知值反序列化为null,请使用READ_UNKNOWN_ENUM_VALUES_AS_NULL
:
允许将未知的Enum值解析为空值的功能。如果禁用,未知的Enum值将引发异常。(...)默认情况下禁用此功能。
这是通过映射器配置完成的:
objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
Run Code Online (Sandbox Code Playgroud)
注意:我刚刚看到您正在使用Jackson 1.9,并且此反序列化功能已在2.0中发布。如果不能进行升级,则可能需要为此属性创建一个自定义解串器,以完成相同的功能。
归档时间: |
|
查看次数: |
18111 次 |
最近记录: |