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
Запечатанный класс данных в Котлине Могу ли я использовать @autowire (spring-context) для настольного приложения kotlin? Kotlin для андроида и статических окончательных внутренних классов Nashorn, передать java-объект javascript как JSON.stringified Невозможно запустить сканирование покрытия (Java / Kotlin / Gradle 3.3 на Windows и Travis) Почему анимация выхода фрагмента не работает? Как использовать @link и @code в kotlin kDoc Смарт-литье в «Тип» невозможно, потому что «переменная» является изменчивым свойством, которое к этому моменту могло быть изменено Как добавить контент из url-чтения в arraylist Синглтон с параметром в Котлине Является ли Kotlin 100% совместимым с ART на Android? ERROR: error.NonExistentClass Kotlin В проекте с несколькими модулями Dagger Почему проверка ссылочного равенства возвращает true, когда ссылка различна Нельзя издеваться над финальным классом Kotlin, используя Mockito 2 Методы доступа за пределами объекта-компаньона – Котлин