如何从对象属性创建地图?

时间:2017-12-05 15:12:03

标签: groovy

我通过第三方api获得了一个对象。我使用包装器函数来获取它,然后从其属性中返回一个映射:

wrapperFunc() {
    def myObj = someapi.getblah().getSomeObect()
    return [
        aaa: myObj.aaa,
        bbb: myObj.bbb,
        ccc: myObj.ccc
    ]
}

现在我可以像这样手动浏览对象中的每个属性,但是是否有一个优雅的groovy功能可以从对象的属性中动态构建一个地图?

3 个答案:

答案 0 :(得分:1)

你可以这样做:

Norway
Australia
Switzerland
...
San Marino
Somalia
Tuvalu

答案 1 :(得分:0)

这基本上是@ jeff-scott-brown答案的变体。

首先,创建一个包含Object-to-Map逻辑的类,该逻辑使用Groovy MetaClass来访问类型的属性。 findAll过滤掉了“class”属性,我假设你不关心它。 collectEntries行将每个MetaProperty对象转换为Map条目。

class ElegantGroovyFeature {
    static Map asType(Object o, Class m) {
        if (m == Map) {
            o.metaClass.properties
                       .findAll { it.getSetter() != null }
                       .collectEntries { prop -> [prop.name, prop.getProperty(o)] }        
        } else {
            o.asType(m)
        }
    }   
} 

扩展程序会覆盖与asType运算符对应的as方法,您可以使用obj as Map表达式将任意对象转换为地图:

def obj = someapi.getBlah().getSomeObject()
use (ElegantGroovyFeature) {
    def mapOfProperties = obj as Map
}

答案 2 :(得分:-1)

const obj = {foo:'bar',baz:42}; const map = new Map(Object.entries(obj)); 的console.log(地图); // Map {foo:“bar”,ba enter code here z:42}