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

如何控制空反序列化与默认值和必需的值在杰克逊与静态编程语言?

商柏
2023-03-14

使用Jackson 2.9.6

我有以下数据类定义:

data class SomeDTO @JsonCreator internal constructor
(
    @get:JsonProperty(value = "first-property", required = true)
    @param:JsonProperty(value = "first-property", required = true)
    val firstProperty: Long?,

    @get:JsonProperty(value = "second-property")
    @param:JsonProperty(value = "second-property")
    val secondProperty: Int = 1234

    @get:JsonProperty("third-property", required = true)
    @param:JsonProperty("third-property", required = true)
    val thirdProperty: Int
)

我对反序列化为SomeDTO的JSON的期望是什么

  1. 如果缺少firstProperty,它应该抛出异常
  2. 如果firstProperty为null,则应将其赋值为null,因为它可以为null
  3. 如果secondProperty缺失或为空,则应将默认值指定为1234
  4. 如果thirdProperty缺失或为null,则应引发异常

基本上,我可以控制哪些值可以反序列化,变成什么。

我所经历的:

如果不使用KotlinMoules,则(1),(2)和(4)工作,但(3)失败:

通用域名格式。fasterxml。杰克逊。数据绑定。exc.mismatchdinPutException:无法将null映射到int类型(将_原语的_null_上的反序列化config.DeserializationFeature.FAIL_设置为'false'以允许)

如果使用KotlinMoules,则(2)、(3)和(4)工作,但(1)失败。

ObjectMapper配置的主要部分:

disable(
        MapperFeature.AUTO_DETECT_CREATORS,
        MapperFeature.AUTO_DETECT_FIELDS,
        MapperFeature.AUTO_DETECT_GETTERS,
        MapperFeature.AUTO_DETECT_IS_GETTERS
       )
disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)

registerModule(ParanamerModule())
registerModule(KotlinModule()) // Might be registered or not

disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE)
enable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES)

我认为使用KotlinMoules更容易,但我不知道如何告诉它,当JSON中缺少属性时,不要自动将空值分配给可为空的字段

共有2个答案

易流觞
2023-03-14

这应该是你想要的:

data class SomeDTO(
        @JsonProperty(value = "first-property", required = true)
        val firstProperty: Long?,

        @JsonProperty(value = "second-property")
        val secondProperty: Int = 1234,

        @JsonProperty("third-property", required = true)
        val thirdProperty: Int
)

几点注意事项:

1.由于您对注释字段使用的是主构造函数,因此在Kotlin中,您不需要@JsonCreator注释。

这是杰克逊项目的GitHub页面所说的:

默认情况下,Jackson在创建值实例时会尝试使用“默认”构造函数(不带参数)。但您也可以选择使用另一个构造函数或静态工厂方法来创建实例。要做到这一点,需要使用注释@JsonCreator,可能还需要使用@JsonProperty注释将名称绑定到参数

周学义
2023-03-14

当缺少firstProperty时,将Kotlin模块更新到2.9.7版会产生异常。我反复测试了它,在2.9.6和2.9.7之间来回测试,代码和配置都是从OP复制的。

2.9.7中的错误修复与OP中描述的意外行为相匹配。

修复了#168其中JsonProperty(required=true)被忽略,并被可空性检查覆盖

https://github.com/FasterXML/jackson-module-kotlin/issues/168

 类似资料:
  • 问题内容: 我有一个JSON字符串,将标记为而不是。因此,例如,如果我有一个没有子对象的对象,我将收到类似以下的字符串: 我想将其反序列化为Parent类,并将子级正确设置为一个空的子级列表。 对于上述JSON字符串,我想要一个对象,其设置为,而设置为。 我会知道如何在整个课堂上使用注释 然后 但是,我想解决一个从字符串正确实例化List的一般问题: 我能得到类似的东西吗? 问题答案: 几个选择;

  • 问题内容: 我想创建一个自定义的序列化程序,该工作量很小,然后将其余的保留给默认序列化。 例如: 通过为聚合对象创建其他自定义序列化程序的想法,这些对象的行为基于“特殊”属性值而有所不同。但是,上面的代码不起作用,因为毫无疑问,它进行了无限递归。 设置属性后,是否可以告诉杰克逊使用默认序列化?我真的不希望像许多自定义序列化程序那样枚举所有属性,因为该类相当复杂,并且我不想每次更改类时都必须对序列化

  • 问题内容: 我正在尝试将以下POJO转换为JSON : 嵌套的City.java如下: 另一个嵌套类State.java如下: 从UserLocation.java转换的JSON如下: 如您所见,该对象作为一个整体进入了内部。但是外部的(“ UserLocation State state city ”的属性,而不只是ID。 我对JackSon API比较陌生。请建议我应该采取哪种方法来达到此要求

  • 我正在尝试使用杰克逊将 JSON 对象反序列化为 Java 对象。json 是由另一位开发人员使用 jackson 库本身创建的,并提供给我。对象图有一个类型为guava的不可变映射的变量,它是一个抽象类。因此,当我尝试反序列化时,杰克逊会给我抛出以下异常。我不是 myJava 类的所有者,因此无法对其进行任何更改,例如通过编写自定义反序列化程序来更改类型或添加注释。 org.codehaus.j

  • 我明白它无法从嵌套JSON反序列化字符串。我解决这个问题的一个方法是通过编写自定义映射器 但是只要pojo中有变化,这就需要修改映射器,添加/删除字段。Mixin工作时没有任何变化,我该如何更新我的Mixin来处理objectId呢?

  • 我想用scala中的jackson反序列化json json_结构: {“type”:“struct”,“fields”:[{“name”:“code_role”,“type”:“string”,“nullable”:true,“metadata”:{“HIVE_type_string”:“string”},{“name”:“libelle_role”,“type”:“string”,“nulla