Kotlin委托对象映射
我正在尝试创建一个映射到kotlin类中,如下所示:Kotlin委托对象映射,kotlin,Kotlin,我正在尝试创建一个映射到kotlin类中,如下所示: class RegisterThingPostBody(inputBody: Map<String, Any>) { val device: Device by inputBody val thing: Thing by inputBody class Device(inputBody: Map<String, Any>) { val serialnumber: String by inputBo
class RegisterThingPostBody(inputBody: Map<String, Any>) {
val device: Device by inputBody
val thing: Thing by inputBody
class Device(inputBody: Map<String, Any>) {
val serialnumber: String by inputBody
val securityCode : String by inputBody
}
class Thing(inputBody: Map<String, Any>) {
val name: String by inputBody
val location: Location by inputBody
class Location(inputBody: Map<String, Any>) {
val street: String by inputBody
val city: String by inputBody
val state: String by inputBody
val lat: Double by inputBody
val lon: Double by inputBody
}
}
}
有什么好方法可以解决这个问题吗?以下内容未经测试(因为您没有提供示例inputBody
的完整示例),并对构造函数进行了一些假设:
import kotlin.reflect.*
import kotlin.reflect.jvm.*
class CreatorMapWrap<T: Any>(val map: Map<String, Any>) {
operator fun getValue(thisRef: Any?, property: KProperty<*>) = property.returnType.jvmErasure.constructors.first().call(map[property.name] as Map<String, Any>) as T
}
class RegisterThingPostBody(inputBody: Map<String, Any>) {
val device: Device by CreatorMapWrap(inputBody)
val thing: Thing by CreatorMapWrap(inputBody)
class Device(inputBody: Map<String, Any>) {
val serialnumber: String by inputBody
val securityCode : String by inputBody
}
class Thing(inputBody: Map<String, Any>) {
val name: String by inputBody
val location: Location by CreatorMapWrap(inputBody)
class Location(inputBody: Map<String, Any>) {
val street: String by inputBody
val city: String by inputBody
val state: String by inputBody
val lat: Double by inputBody
val lon: Double by inputBody
}
}
}
导入kotlin.reflect*
导入kotlin.reflect.jvm*
类CreatorMap(val映射:映射){
运算符fun getValue(thisRef:Any?,property:KProperty)=property.returnType.jvmErasure.constructors.first()。调用(map[property.name]作为map)作为T
}
类注册表ThingPostBody(inputBody:Map){
val设备:由CreatorMap(inputBody)创建的设备
val thing:thing by CreatorMap(inputBody)
类设备(inputBody:Map){
val serialnumber:按inputBody显示的字符串
val securityCode:按inputBody显示的字符串
}
类对象(inputBody:Map){
val名称:按inputBody显示的字符串
val位置:CreatorMap(inputBody)的位置
类位置(inputBody:Map){
val street:按inputBody输入的字符串
val city:按inputBody输入的字符串
val状态:按inputBody显示的字符串
val lat:由inputBody加倍
val-lon:通过输入体加倍
}
}
}
以下内容未经测试(因为您没有提供示例inputBody
的完整示例),并对构造函数进行了一些假设:
import kotlin.reflect.*
import kotlin.reflect.jvm.*
class CreatorMapWrap<T: Any>(val map: Map<String, Any>) {
operator fun getValue(thisRef: Any?, property: KProperty<*>) = property.returnType.jvmErasure.constructors.first().call(map[property.name] as Map<String, Any>) as T
}
class RegisterThingPostBody(inputBody: Map<String, Any>) {
val device: Device by CreatorMapWrap(inputBody)
val thing: Thing by CreatorMapWrap(inputBody)
class Device(inputBody: Map<String, Any>) {
val serialnumber: String by inputBody
val securityCode : String by inputBody
}
class Thing(inputBody: Map<String, Any>) {
val name: String by inputBody
val location: Location by CreatorMapWrap(inputBody)
class Location(inputBody: Map<String, Any>) {
val street: String by inputBody
val city: String by inputBody
val state: String by inputBody
val lat: Double by inputBody
val lon: Double by inputBody
}
}
}
导入kotlin.reflect*
导入kotlin.reflect.jvm*
类CreatorMap(val映射:映射){
运算符fun getValue(thisRef:Any?,property:KProperty)=property.returnType.jvmErasure.constructors.first()。调用(map[property.name]作为map)作为T
}
类注册表ThingPostBody(inputBody:Map){
val设备:由CreatorMap(inputBody)创建的设备
val thing:thing by CreatorMap(inputBody)
类设备(inputBody:Map){
val serialnumber:按inputBody显示的字符串
val securityCode:按inputBody显示的字符串
}
类对象(inputBody:Map){
val名称:按inputBody显示的字符串
val位置:CreatorMap(inputBody)的位置
类位置(inputBody:Map){
val street:按inputBody输入的字符串
val city:按inputBody输入的字符串
val状态:按inputBody显示的字符串
val lat:由inputBody加倍
val-lon:通过输入体加倍
}
}
}
我喜欢这样,我做的一个更改是在CreatorMap
的构造函数中引入kClass
,如下所示:类对象映射(val-map:map,val-kClass:kClass)
。然后定义如下:valdevicebyobjectmap(inputBody,device::class)
,但基本相同。。谢谢我喜欢这样,我做的一个更改是在CreatorMapWrap
的构造函数中引入kClass
,如下所示:类对象映射(val-map:map,val-kClass:kClass)
。然后定义如下:valdevicebyobjectmap(inputBody,device::class)
,但基本相同。。谢谢