使用jackson忽略JSON对象上的未知字段

使用jackson忽略JSON对象上的未知字段,jackson,Jackson,我使用Jackson2.x进行序列化和反序列化。我已将objectMapper注册到加力燃烧室模块,并将objectMapper配置为忽略未知属性 objectMapper.registerModule(new AfterBurnerModule()); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 但当它试图序列化一个对象时失败,因为找到了属性错误的未知字段 java对象还带

我使用Jackson2.x进行序列化和反序列化。我已将objectMapper注册到加力燃烧室模块,并将objectMapper配置为忽略未知属性

objectMapper.registerModule(new AfterBurnerModule());
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
但当它试图序列化一个对象时失败,因为找到了属性错误的未知字段

java对象还带有@JsonIgnoreProperties注释(ignoreUnknown=true)

有人能帮我理解可能出了什么问题吗

下面是Util类

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

}
甲级

package sample;

@JsonIgnoreProperties(ignoreUnknown = true)
public class A {
@JsonProperty
    private NumberEnum number;
}
我反序列化的代码如下所示

A a = Util.convertToObject(str, A.class);
我试图反序列化的字符串如下所示:

{
  "number": "Num"
}
以下是反序列化时的错误:

com.fasterxml.jackson.databind.exc.InvalidFormatException:无法从字符串值“Num”构造sample.numbernum的实例:值不是声明的枚举实例名称之一:[1,2] at(通过引用链:sample.A[“A”]->sample.NumberEnum[“number”])


类A是从jar导入的,它使用的是jackson library 1.9,ignoreUnknown仅适用于目标对象中未知的属性名。例如,如果您有:

{
  "number": "ONE",
  "foo": "bar"  
}
如果您试图反序列化的对象没有名为“foo”的setter/属性,Jackson通常会失败

你想要完成的是完全不同的;属性是已知的,但您正在尝试处理无效的枚举值。如果您只想将未知值反序列化为null,请使用:

允许将未知枚举值解析为空值的功能。如果禁用,未知枚举值将引发异常。默认情况下,(…)功能处于禁用状态

这是通过映射器配置完成的:

objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);

注意:我刚刚看到您正在使用Jackson 1.9,这个反序列化功能是在2.0中发布的。如果升级不是一个选项,您可能需要为此属性创建一个自定义反序列化程序,该反序列化程序也可以执行相同的操作。

我认为您需要反序列化的实际上是json,如下所示:

{
“编号”:“一”
}

-或-

{
“数字”:“两个”
}


由于“Num”不是任何一个枚举的name(),因此它将不会反序列化

能否提供有关错误的详细信息以及代码段?忽略未知属性与反序列化相关,但您正试图序列化一个对象,因此它不应该起作用。@MarkPeters添加了更多详细信息
objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);