【问题标题】:Groovy object properties in map地图中的 Groovy 对象属性
【发布时间】:2016-03-17 21:43:59
【问题描述】:

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

prop1: object.prop1

你不能像下面那样把对象放在那里吗?或者什么是实现这一目标的正确方法?

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

【问题讨论】:

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

标签: groovy


【解决方案1】:

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']

【讨论】:

    【解决方案2】:

    如果您不介意使用一些库,这里有一个选项,您可以将对象转换为 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
    }
    }
    

    【讨论】:

      【解决方案3】:

      这似乎运作良好

      *:object.properties
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-03
        • 2011-09-14
        • 2013-03-06
        • 1970-01-01
        相关资源
        最近更新 更多