暴露:如何解析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