如何防止杰克逊(德)序列化某些属性?
对于任何Kotlin类,以componentX()
的格式为每个公共属性生成一个方法,所以这个类:
public data class Dog(public var name: String, public var age: Double)
在Java中相当于这样的东西:
public class Dog { private String name; private double age; public Dog(@NotNull String name, @NotNull double age) { // assign values } // Getters and setters for name and age // toString(), equals(), and hashCode() public String component1() { return name; } public double component2() { return age; } }
这与Jackson getXxx()
,因为它将每个componentX()
方法和每个getXxx()
方法作为(de)序列化目标进行getXxx()
。
到目前为止,我一直在解决这个问题的方法是用Java创建我的所有模型,而不是首选。
简而言之,如何配置ObjectMapper,使其忽略componentX()
方法?
注意: 在接受的答案中描述的@JsonFilter的细节是不需要的
杰克逊的默认行为没有什么需要。 使用当前和最近的杰克逊版本没有这样的行为,如上所述。 有时Google会显示一个旧版本,它被打包成org.codehaus.*
而不是com.fasterxml.*
在杰克逊,如果该属性看起来不像JavaBean属性,则不会被反序列化。 而componentX
看起来不像JavaBean的属性。
这是一个测试用例,证明使用原始的杰克逊,也结合杰克逊模块的Kotlin都按预期工作,也没有这个问题。
class StackOverflowTest { public data class Dog(public var name: String, public var age: Double) @Test public fun testSimpleDeser() { val dogObj = Dog("Avi", 1.5) val expectedJson = """{"name":"Avi","age":1.5}""" assertEquals(expectedJson, ObjectMapper().writeValueAsString(dogObj)) assertEquals(expectedJson, jacksonObjectMapper().writeValueAsString(dogObj)) } }
我用Jackson 2.6.4
进行了测试,但是我相信2.5.x
, 2.6.x
或2.7.x
都没有这个问题,因为现在已经和Kotlin一起使用了很久了。
除了一个自定义的序列化器/反序列化器,看看@JsonFilter。 它可以使用混合应用程序,您可以使用自定义逻辑,如筛选出所有以componentX开头的属性(如果需要)。
这里是解释如何创建自定义过滤器的文档: http : //wiki.fasterxml.com/JacksonFeatureJsonFilter这是非常简单的做。
可能有更好的方法,但这应该工作。
编辑:也看看http://wiki.fasterxml.com/JacksonJsonViews 。 这更多的是定义可以忽略的属性的静态方法,所以我不认为这对你有用,过滤器可能更好。
- 使用Retrofit2 + RxJava + Jackson重试202状态码
- 覆盖一些控制器的@JsonIgnore注释。 杰克逊。 弹簧
- POJO在kotlin中响应这个XML响应
- 为什么Spring MVC JSON的Kotlin返回一个空对象?
- JsonProperty不能在缩小时启用
- SpringBoot + Jackson + Kotlin数据类:字段注释被忽略
- jackson@JsonIgnoreProperties多个字段与Kotlin
- 即使使用jackson-datatype-jsr310,Instant也不能被序列化为适当的格式
- 将ByteArrayOutputStream转换为Kotlin中的json