使用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的期望是什么
firstProperty
,它应该抛出异常
firstProperty
为null,则应将其赋值为null,因为它可以为null
secondProperty
缺失或为空,则应将默认值指定为1234
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中缺少属性时,不要自动将空值分配给可为空的字段
这应该是你想要的:
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注释将名称绑定到参数
当缺少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