将地图转换为数据类

时间:2018-08-17 15:49:48

标签: java kotlin

Kotlin中是否有一种简单的方法可以让我将Map转换为任意数据类?

我要转换的地图具有数据类必填字段的所有键。

我已经四处寻找,但找不到任何似乎可以用一种非常通用的方式谈论此事的东西。

我知道我可以使用ObjectMapper,但这需要一个额外的库。寻找Kotlin可以提供的功能。

3 个答案:

答案 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)