如何防止杰克逊(反)序列化某些属性?
How to prevent Jackson from (de)serializing certain properties?
对于任何 Kotlin 类,都会为格式 componentX()
中的每个 public 属性生成一个方法,因此此类:
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 感到困惑,因为它将每个 componentX()
方法 和 每个 getXxx()
方法视为(反)序列化目标。
到目前为止,我解决这个问题的方法是在 Java 中创建我的所有模型,这不是首选。
简而言之,如何配置 ObjectMapper 使其忽略 componentX()
方法?
除了自定义 serializer/deserializer 看看@JsonFilter。它可以使用 mixin 应用,您可以使用自定义逻辑,例如过滤掉所有以 componentX 开头的属性。
这是解释如何创建自定义过滤器的文档:
http://wiki.fasterxml.com/JacksonFeatureJsonFilter 做起来非常简单。
可能有更好的方法,但这应该可行。
编辑:另请参阅 http://wiki.fasterxml.com/JacksonJsonViews。这更像是一种定义可以忽略的属性的静态方法,所以我认为这对您不起作用,过滤器可能更好。
注意: 不需要接受答案中描述的@JsonFilter的详细信息
不需要 Jackson 的默认行为。使用当前和最近的 Jackson 版本没有描述的这种行为。有时 Google 显示打包为 org.codehaus.*
而不是 com.fasterxml.*
的旧版本
在 Jackson 中,如果 属性 看起来不像 JavaBean 属性,则不会反序列化。而且 componentX
看起来不像 JavaBean 属性。
这是一个测试用例,证明使用原始 Jackson 以及它与 Jackson Module for Kotlin 结合使用都按预期工作,并且都没有这个问题。
class WhosebugTest {
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
的 none 有这个问题是因为这些都已经与 Kotlin 一起使用了很长时间。
对于任何 Kotlin 类,都会为格式 componentX()
中的每个 public 属性生成一个方法,因此此类:
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 感到困惑,因为它将每个 componentX()
方法 和 每个 getXxx()
方法视为(反)序列化目标。
到目前为止,我解决这个问题的方法是在 Java 中创建我的所有模型,这不是首选。
简而言之,如何配置 ObjectMapper 使其忽略 componentX()
方法?
除了自定义 serializer/deserializer 看看@JsonFilter。它可以使用 mixin 应用,您可以使用自定义逻辑,例如过滤掉所有以 componentX 开头的属性。
这是解释如何创建自定义过滤器的文档: http://wiki.fasterxml.com/JacksonFeatureJsonFilter 做起来非常简单。
可能有更好的方法,但这应该可行。
编辑:另请参阅 http://wiki.fasterxml.com/JacksonJsonViews。这更像是一种定义可以忽略的属性的静态方法,所以我认为这对您不起作用,过滤器可能更好。
注意: 不需要接受答案中描述的@JsonFilter的详细信息
不需要 Jackson 的默认行为。使用当前和最近的 Jackson 版本没有描述的这种行为。有时 Google 显示打包为 org.codehaus.*
而不是 com.fasterxml.*
在 Jackson 中,如果 属性 看起来不像 JavaBean 属性,则不会反序列化。而且 componentX
看起来不像 JavaBean 属性。
这是一个测试用例,证明使用原始 Jackson 以及它与 Jackson Module for Kotlin 结合使用都按预期工作,并且都没有这个问题。
class WhosebugTest {
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
的 none 有这个问题是因为这些都已经与 Kotlin 一起使用了很长时间。