暴露:如何解析JSON到一个实体类

我有以下用户表对象和实体类:

object UserTable : IntIdTable() { val name = varchar("name", 256) } class User(id: EntityID): IntEntity(id) { companion object : IntEntityClass(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::class.java) val user = User.new { name = data.name } } 

在这个人为的例子中,这并不坏,但是我想知道是否有更干的方法。

Exposed不允许自己创建DAO对象,因为您始终需要将EntityID传递给构造函数。 但是, jackson支持阅读现有的对象 。 所以,你可以写这样的东西:

 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

为了使用Jackson,将以下内容添加到build.gradle文件中(如果您不使用gradle,则必须将该代码调整到您的构建系统):

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

这是一个完整的工作示例: https : //gist.github.com/msrd0/1d8d3d76de4010cc72868d8a36f0560a