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