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

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

傅涵忍
2023-03-14

我使用jackson 2. x进行序列化和反序列化。我注册了对象映射器到后燃烧器模块,并配置对象映射器忽略未知属性

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;

public enum NumberEnum {
ONE, TWO
}

甲级

package sample;

@JsonIgnoreProperties(ignoreUnknown = true)
public class A {
@JsonProperty
    private NumberEnum number;
}

我反序列化的代码如下所示

A a = Util.convertToObject(str, A.class);

我试图反序列化的字符串如下所示:

{
  "number": "Num"
}

以下是反序列化时的错误:

通用域名格式。fasterxml。杰克逊。数据绑定。exc.InvalidFormatException:无法构造示例实例。NumberEnum来自字符串值“Num”:值不是声明的枚举实例名称之一:[1,2]at(通过引用链:sample.A[“A”]-

类A是从jar导入的,它使用的是jackson library 1.9

共有2个答案

傅边浩
2023-03-14

我认为你需要反序列化的实际上是json,看起来像这样:{"number":"ONE"}

-或者-

{"number":"TWO"}

因为"Num"不是枚举的名称(),所以它不会反序列化

宣望
2023-03-14

ignoreUnknown仅适用于目标对象中未知的属性名称。例如,如果您有:

{
  "number": "ONE",
  "foo": "bar"  
}

如果您试图反序列化的对象没有名为"foo"的setter/属性,Jackson通常会失败。

您试图完成的是完全不同的;属性是已知的,但您试图处理无效的枚举值。如果您只是希望它将未知值反序列化为null,请使用READ_UNKNOWN_ENUM_VALUES_AS_NULL

允许将未知Enum值解析为空值的功能。如果禁用,未知的Enum值将引发异常。(...)默认情况下禁用功能。

这是通过mapper配置完成的:

objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);

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

 类似资料:
  • 问题内容: 我正在使用Jackson JSON库将一些JSON对象转换为android应用程序上的POJO类。问题是,JSON对象可能会更改,并且在发布应用程序时会添加新字段,但是即使添加简单的String字段(即使可以安全地忽略),当前它也会中断。 有什么办法告诉杰克逊忽略新添加的字段?(例如,在POJO对象上不存在)?全局忽略将是巨大的。 问题答案: Jackson提供了可以在类级别使用的注释

  • 知道我做错了什么吗?如果重要的话,我将使用Jackson-core 2.1.1。

  • 我有一个问题。 然后在第二类中,即使我没有使用第二个字段,它仍然被添加为NULL。 我怎样才能避免这种情况呢?

  • 我正在用java中的jackson构建一个json体。它会像下面这样 基于不同的 REST URI,json 主体必须忽略某些字段或元素。如何使用杰克逊忽略上述 json 正文中的“学生”部分?当我忽略它时,我应该只能得到 但我得到它如下,这是不正确的- 我有两个带有getters和setters的类,一个作为主语,另一个作为学生。我尝试使用@JsonIgnore,但是它忽略了所有的URI,这是我

  • 问题内容: 我收到以下错误,但找不到解决方法对我有用: 无法识别的字段“ GaugeDeviceId”(GaugeDevice类),未标记为可忽略 问题似乎是,该服务返回的属性名称前带有一个大写字母,而类属性则以一个下一个字母开头。 我试过了: 将propertyNames更改为第一个大写字母-相同的错误 添加到属性实例化-同样的错误 添加到相应的吸气剂-同样的错误 添加到相应的二传手-同样的错误