Как предотвратить Джексона от (де) сериализации определенных свойств?

Для любого класса 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; } } 

Это беспорядок с Джексоном, поскольку он рассматривает его как каждый метод componentX() и каждый метод getXxx() как цель (де) сериализации.

То, как я до сих пор обошел это до сих пор, – это создать все мои модели на Java, что не является предпочтительным.

Короче говоря, как я могу настроить ObjectMapper так, чтобы он игнорировал методы componentX() ?

Примечание: детали @JsonFilter, описанные в принятом ответе, не нужны

Ничего, кроме поведения Джексона по умолчанию, не требуется. Используя текущие и недавние версии Джексона, такого поведения, как описано, не существует. Иногда Google показывает старую версию, которая упакована как org.codehaus.* Вместо com.fasterxml.*

В Jackson, если свойство не похоже на свойство JavaBean, оно не будет десериализовано. А componentX не похож на свойства JavaBean.

Вот тестовый пример, который доказывает использование как сырого Джексона, так и его сочетания с модулем Jackson для 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)) } } 

Я 2.5.x тест с Jackson 2.6.4 но я уверен, что ни одна из 2.5.x , 2.6.x или 2.7.x имеет этой проблемы, поскольку все они уже давно используются с Kotlin.

Кроме того, пользовательский сериализатор / десериализатор взгляните на @JsonFilter. Его можно применять с помощью mixin, и вы можете использовать собственную логику, такую ​​как фильтрация всех свойств, которые начинаются с componentX, если хотите.

Вот документация, в которой объясняется, как вы можете создать собственный фильтр: http://wiki.fasterxml.com/JacksonFeatureJsonFilter Это довольно просто.

Там может быть лучший способ, но это должно сработать.

Изменить: Также посмотрите на http://wiki.fasterxml.com/JacksonJsonViews . Это скорее статический способ определения свойств, которые можно игнорировать, поэтому я не думаю, что это сработает для вас, и фильтры, вероятно, лучше.