Kotlin中是否有一种简单的方法可以让我将Map转换为任意数据类?
我要转换的地图具有数据类必填字段的所有键。
我已经四处寻找,但找不到任何似乎可以用一种非常通用的方式谈论此事的东西。
我知道我可以使用ObjectMapper
,但这需要一个额外的库。寻找Kotlin可以提供的功能。
答案 0 :(得分:4)
为什么不只使用地图委托人?
gradle --stop
export M2_HOME=/tmp/other_em_two
export M2_REPO=$M2_HOME/repository
mkdir -p $M2_REPO
tree $M2_REPO
gradle -Dmaven.repo.local=$M2_REPO pTML
tree $M2_REPO
或者您可以使用伴随对象包装它,并使用class MyData(val map: Map<String, String>) {
val foo by map
val bar by map
}
MyData.from(mymap)
答案 1 :(得分:1)
也许delegated properties适合您。这样,您也可以调整地图。但是,这还允许添加不可1:1映射到您的类属性的键和值,例如:
class Int:
def __init__(self, value):
self.value = value
def __add__(self, v):
self.value += v
return self
def __repr__(self):
return str(self.value)
现在,如果class YourData {
val backedMap = mutableMapOf<String, String>()
var someProp by backedMap
}
val obj = YourData().apply {
someProp = "value"
}
可见,那么即使不存在任何这样的属性,也可以添加以下内容:
backedMap
但是另一方面,可以使用同一张地图自动填写您的字段:
obj.backedMap["unknown prop"] = "some other value"
另一种方法是“仅”使用反射。这样,您就可以省略背景图,而只需扫描属性即可,例如:
val sourceMap = mutableMapOf("someProp" to "newValue") // the map you want to use to automatically fill up your data class
sourceMap.forEach { key, newValue -> obj.backedMap[key] = newValue }
答案 2 :(得分:1)
使用kotlin反射将构造函数参数映射到映射值 这个通用函数适用于任何在主构造函数中接收字段数据的类
与 Firebase 等 JSON 数据库配合良好,并使用 Firebase DocumentSnapshot.data 中的 Map 对象进行了测试
fun <T : Any> mapToObject(map: Map<String, Any>, clazz: KClass<T>) : T {
//Get default constructor
val constructor = clazz.constructors.first()
//Map constructor parameters to map values
val args = constructor
.parameters
.map { it to map.get(it.name) }
.toMap()
//return object from constructor call
return constructor.callBy(args)
}
一些课程
data class Person(val firs: String, val last: String)
这样使用
mapToObject(map, Person::class)