而不是必须从像这样的对象声明地图中的所有属性:
prop1: object.prop1
难道你不能以某种方式将对象放在那里吗?或者什么是实现这一目标的正确方法?
results: [
object,
values: [
test: 'subject'
]
]
答案 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
}
}