地图中的Groovy对象属性

时间:2016-03-17 21:43:59

标签: groovy

而不是必须从像这样的对象声明地图中的所有属性:

prop1: object.prop1

难道你不能以某种方式将对象放在那里吗?或者什么是实现这一目标的正确方法?

results: [
    object, 
    values: [
        test: 'subject'
    ]
]

3 个答案:

答案 0 :(得分:4)

object.properties也会给你一个class

你应该可以这样做:

鉴于您的POGO对象:

class User {
    String name
    String email
}

def object = new User(name:'tim', email:'tim@tim.com')

编写一个方法来检查类并从中提取非合成属性:

def extractProperties(obj) {
    obj.getClass()
       .declaredFields
       .findAll { !it.synthetic }
       .collectEntries { field ->
           [field.name, obj."$field.name"]
       }
}

然后,地图将其传播到您的结果地图中:

def result = [
    value: true, 
    *:extractProperties(object)
]

给你:

['value':true, 'name':'tim', 'email':'tim@tim.com']

答案 1 :(得分:0)

这似乎运作良好

*:object.properties

答案 2 :(得分:0)

如果你不介意在这里使用几个库,你可以选择将对象转换为json,然后将其解析为map。我将我的内容添加到了一个baseObject,在你的case中,它会扩展。

class BaseObject {
  Map asMap() {
    def jsonSlurper = new groovy.json.JsonSlurperClassic()
    Map map = jsonSlurper.parseText(this.asJson())
    return map
  }
  String asJson(){
    def jsonOutput = new groovy.json.JsonOutput()
    String json = jsonOutput.toJson(this)
    return json
  }
}

最初也是在没有json库的情况下编写的。这与其他答案类似,但处理对象属性为List的情况。

class BaseObject {
Map asMap() {
    Map map = objectToMap(this)
    return map
}   
def objectToMap(object){
    Map map = [:]
    for(item in object.class.declaredFields){
        if(!item.synthetic){
            if (object."$item.name".hasProperty('length')){
                map."$item.name" = objectListToMap(object."$item.name")
            }else if (object."$item.name".respondsTo('asMap')){
                map << [ (item.name):object."$item.name"?.asMap() ]
            } else{
                map << [ (item.name):object."$item.name" ]
            }
        }
    }
    return map
}

def objectListToMap(objectList){
    List list = []
    for(item in objectList){
        if (item.hasProperty('length')){
            list <<  objectListToMap(item)
        }else {
            list << objectToMap(item)
        }
    }
    return list
}
}