Exposed: как разбирать JSON в классе Entity

У меня есть следующий объект и класс объекта пользователя:

object UserTable : IntIdTable() { val name = varchar("name", 256) } class User(id: EntityID<Int>): IntEntity(id) { companion object : IntEntityClass<User>(UserTable) val name by UserTable.name } 

Есть ли способ использовать Gson (или некоторую другую библиотеку) для анализа JSON в экземпляре User , а затем вставить его? Из того, что я могу сказать, мне кажется, что мне придется создать промежуточный класс данных UserData а затем вручную скопировать поля.

 data class UserData { var id: Int? var name: String? } fun main() { val data = Gson().fromJson<UserData>("...", UserData::class.java) val user = User.new { name = data.name } } 

Это не так уж плохо на этом надуманном примере, но мне интересно, есть ли сухой подход.

Exposed не позволяет создавать объекты DAO самостоятельно, потому что вам всегда нужно передать EntityID конструктору. Однако Джексон поддерживает чтение существующего объекта . Итак, вы можете написать что-то вроде этого:

 transaction { User.new { mapper.readerForUpdating(this).readValue(json) } } 

Чтобы убедиться, что Jackson и Exposed не вмешиваются, вам нужно создать свой mapper следующим образом:

 val mapper by lazy { val mapper = jacksonObjectMapper() mapper.setAnnotationIntrospector(object : JacksonAnnotationIntrospector() { override fun hasIgnoreMarker(m : AnnotatedMember) = (m.getDeclaringClass() == IntEntity::class.java) || (m.getDeclaringClass() == Entity::class.java) || super.hasIgnoreMarker(m) }) mapper } 

Также обратите внимание, что вы не можете поместить аннотацию @JsonProperty на делегированные свойства, но вы должны использовать @get:JsonProperty .

Чтобы использовать Джексон, добавьте следующее в свой файл build.gradle (если вы не используете gradle, вам придется адаптировать этот код к вашей системе сборки):

 compile "com.fasterxml.jackson.module:jackson-module-kotlin:2.9.0" 

Вот полный рабочий пример: https://gist.github.com/msrd0/1d8d3d76de4010cc72868d8a36f0560a

Intereting Posts
Где intelliJ помещает kotlin.js в Мультиплатформенный проект java.lang.Integer нельзя передать в java.lang.Long в Kotlin (когда начальное значение равно null) Android Room – выбор запроса с помощью LIKE Скомпилируйте Kotlin с зависимостью jar из командной строки Тема Kotlin Quasar и проблема блокировки канала Класс Kotlin работает как тесты junit, даже если он находится в пакете androidTest – для класса Java он работает нормально Котлин. Базовое приложение JavaFX Поддерживает ли Kotlin Ormlite 100%? (Классы данных) Как класс макета может не соответствовать его классу java в Котлине? Как сделать плагин идеи в градле генерировать правильную конфигурацию проекта для Kotlin? Подкласс RelativeLayout со вторичными конструкторами в Котлине Класс тестирования детей Kotlin запускает все родительские тесты Markdown # против нескольких # Неразрешенная ссылка: Kotlin нуждается в 2 сборках после очистки, чтобы получить код при использовании kapt Волейбольная библиотека. Где я ошибся с Ответчиком?