使用Jackson自定义反序列化JSON字段

sl

我正在使用Jackson来反序列化一些JSON,并且在尝试对其中一个字段使用自定义反序列化器时遇到了麻烦。

class MyClass
{
    private static class SpecialPropertyDeserializer extends JsonDeserializer<SpecialProperty>
    {
        @Override
        public SpecialProperty deserialize(JsonParser jsonParser,
                                           DeserializationContext deserializationContext) throws IOException, JsonProcessingException
        {
            // do some custom deserialisation
        }
    }

    private static class SpecialProperty
    {
        private String m_foo;

        private String m_bar;

        @JsonCreator
        SpecialProperty(@JsonProperty("foo") String foo,
                        @JsonProperty("bar") String bar)
        {
            m_foo = foo;
            m_bar = bar;
        }
    }

    private String m_identifier;

    private String m_version;

    @JsonDeserialize(using = SpecialPropertyDeseializer.class)
    private SpecialProperty m_specialProperty;

    @JsonCreator
    MyClass(@JsonProperty("identifier") String identifier,
            @JsonProperty("version") String version,
            @JsonProperty("specialProperty") SpecialProperty specialProperty)
    {
        m_identifier = identifier;
        m_version = version;
        m_specialProperty = specialProperty;
    }
}

这是我要反序列化的JSON:

{
    "identifier" : "some-id",
    "version"    : "1.7",
    "specialProperty"    : {
        "foo" : "str1",
        "bar" : "str2"
    },
}

我按如下方式调用映射器:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);   
return objectMapper.readValue(input, MyClass.class);

我观察到以下行为:

  1. 如果没有特殊属性,则一切正常-即SpecialProperty从代码和JSON中删除所有对它的引用
  2. 如果我包含SpecialProperty在JSON中,但删除了它的自定义解串器,则它也可以正常工作。的ctorSpecialProperty被调用。
  3. 使用自定义反序列化器将无法正常工作。的ctorSpecialProperty被调用,但是自定义反序列化器未被调用。

我究竟做错了什么?

马诺斯·尼古拉迪斯(Manos Nikolaidis)

@JsonDeserialize批注可以放在字段,设置器或类上。如果注释的内容是用于设置值的,Jackson将考虑到它。

Eg1@JsonDeserialize如果使用setter来设置字段的值,它将注意到setter。

Eg2@JsonDeserialize如果在不使用setter或构造函数的情况下直接设置了该字段,它将注意到一个字段。

除非在字段或setter docs上被更特定的注释所覆盖,否则它将倾向于将其考虑在类中我认为有关上述细节的文档可能会更清楚。

在您的情况下,您在SpecialProperty字段上具有注释,但是您正在MyClass构造函数中设置此字段,因此将其忽略。

在这种情况下,您可以@JsonDeserialize在课程上移动而不是在字段上移动。在您的情况下,这可能是最简单的解决方案。例如

@JsonDeserialize(using = MyClass.SpecialPropertyDeserializer.class)
private static class SpecialProperty {

或者,您可以完全跳过注释,并在映射器上注册解串器。首先创建SpecialPropertySpecialPropertyDeserializer非私有MyClass,然后:

ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(MyClass.SpecialProperty.class, new MyClass.SpecialPropertyDeserializer());
objectMapper.registerModule(module);

您还可以摆脱的构造函数,MyClass并且SpecialProperty将考虑字段上的当前注释

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用尊重自定义注释的Jackson来执行自定义JSON反序列化?

使用Jackson自定义JSON反序列化

某些字段的Jackson JSON自定义序列化

在Java中使用Jackson进行JSON FIELD的自定义反序列化?

如何为Jackson编写自定义JSON反序列化器?

在Java中使用Jackson反序列化Date字段时引发自定义异常

如何在Jackson JSON(反序列化)中自定义序列化或转换具有自定义键类型的Map属性?

如何使用Serde使用自定义函数反序列化可选字段?

使用Jackson进行自定义反序列化:扩展默认反序列化器

Jackson,针对特定字段名称的自定义反序列化

当值为“ null”时,Jackson忽略自定义字段反序列化器

Jackson对多态对象的自定义反序列化

使用Jackson自定义反序列化列表

使用jackson-dataformat-xml自定义根元素的XML反序列化?

自定义反序列化

使用Jackson在Java中嵌套自定义反序列化

使用lombok自定义序列化和反序列化的字段名称

使用自定义IXmlSerializer反序列化注释

使用Json.NET为具有多个值类型的字段自定义反序列化器

仅当存在某些字段时才使用自定义JSON反序列化(使用Jackson)

使用Jackson的自定义JSON序列化/反序列化

Jackson JSON无法使用自定义根名称反序列化元素数组?

Jackson中的自定义JSON反序列化,排除invalide数组

Jackson-仅将自定义反序列化器用于特定的JSON

使用 Jackson 从 JSON 反序列化 Scala 地图字段

使用自定义反序列化器 Jackson 将 .json 文件转换为 Java 对象

Ktor自定义json对象反序列化

使用 System.Text.Json 自定义反序列化 - 将字段分组为对象

JSON.Net - 如何反序列化自定义类型的嵌套字段