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

Для любого класса 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 . Это скорее статический способ определения свойств, которые можно игнорировать, поэтому я не думаю, что это сработает для вас, и фильтры, вероятно, лучше.

Intereting Posts
Ошибка: невозможно получить доступ к NotNull Несколько конструкторов в неизменяемом (data) классе Метод равенства для класса данных в котлине Есть ли способ сделать BigDecimal быстрее, чем здесь? Котлин не видит аксессуаров Java Lombok? Дженерики на KProperty1.getDelegate слишком ограничительные? RxJava не может быть завершен, как избежать toBlocking () Вызов java-кода, который не принимает значение null от kotlin «Java» «не распознается как внутренняя или внешняя команда, программный или командный файл. в Котлине Интерфейс Kotlin представляет собой класс java: случайное переопределение Как использовать @link и @code в kotlin kDoc GMaps Android API и GeoJson, как покрыть весь мир дырой Как получить KProperty1 из KProperty0 libgdx AssetManager preload ttf шрифт не работает Как правильно реализовать lateinit с пользовательскими объектами класса для использования в onCreate () в android, избегая ошибки Property getter или setter expected