map中的Groovy对象属性

map中的Groovy对象属性,groovy,Groovy,不必从对象声明贴图中的所有属性,例如: prop1: object.prop1 你就不能像下面那样把东西扔进去吗?或者什么是实现这一目标的正确方法 results: [ object, values: [ test: 'subject' ] ] 这似乎很有效 *:object.properties object.properties也将为您提供一个类 您应该能够做到: 考虑到您的POGO对象: class User { String nam

不必从对象声明贴图中的所有属性,例如:

prop1: object.prop1
你就不能像下面那样把东西扔进去吗?或者什么是实现这一目标的正确方法

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

这似乎很有效

*:object.properties

object.properties也将为您提供一个

您应该能够做到:

考虑到您的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']

如果您不介意使用一些库,这里有一个选项,您可以将对象转换为json,然后将其解析为映射。我将我的添加到baseObject中,在您的情况下,该对象将扩展

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库。这与其他答案类似,但处理对象属性为列表的情况

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
}
}
类基本对象{
映射asMap(){
Map Map=objectToMap(此)
返回图
}   
def objectToMap(对象){
Map=[:]
for(object.class.declaredFields中的项){
如果(!item.synthetic){
if(对象“$item.name”.hasProperty('length')){
映射“$item.name”=ObjectListMap(对象“$item.name”)
}else if(object.“$item.name.”respondsTo('asMap')){

映射如果对象是一个映射,那么
*:object
我应该提到它是一个POGO。但是我今天从你的回答中学到了一些新的东西。谢谢!*:object.properties似乎有效。谢谢
object.properties
有时会带来额外的负担(不是你创建的属性),请参阅下面的不同解决方案:-)