【问题标题】:ignoring unknown fields on JSON objects using jackson使用杰克逊忽略 JSON 对象上的未知字段
【发布时间】:2016-06-06 02:12:00
【问题描述】:

我正在使用 jackson 2.x 进行序列化和反序列化。我已将 objectMapper 注册到 afterBurner 模块并将对象映射器配置为忽略未知属性

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

}

枚举类 NumberEnum

package sample;

public enum NumberEnum {
ONE, TWO
}

A类

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.NumberEnum 的实例:值不是声明的枚举实例名称之一:[ONE,TWO] at(通过引用链:sample.A["a"]->sample.NumberEnum["number"])

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

【问题讨论】:

  • 你能提供更多关于错误的信息,以及代码sn-p吗?忽略未知属性与 反序列化 相关,但您正在尝试序列化对象,因此它不应该发挥作用。
  • @MarkPeters 添加了更多详细信息

标签: jackson


【解决方案1】:

我认为您需要反序列化的实际上是如下所示的 json: { "number": "ONE" }

- 或-

{ "number": "TWO" }

因为 "Num" 不是你的任何一个枚举的 name() 它不会反序列化

【讨论】:

    【解决方案2】:

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

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

    如果您尝试反序列化的对象没有名为“foo”的设置器/属性,Jackson 通常会失败。

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

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

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

    objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
    

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

    【讨论】:

      猜你喜欢
      • 2018-05-01
      • 2022-06-22
      • 2015-03-20
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 2020-09-28
      • 1970-01-01
      相关资源
      最近更新 更多