我尝试解析JSON数据并将其分配给Grails中的POJO。
我从
开始obj.param=jsonRequest.jsonWrap.attrib.something.jsonParam
经过一些实验和重构后,它现在看起来像这样。
jsonRequest.jsonWrap.attrib.something.with {
obj.param1=jsonParam1
obj.param2=jsonParam2
//...
}
}
现在,我可以避免重复使用obj引用吗?
答案 0 :(得分:2)
我不认为有一种简单的方法来欺骗groovy进入"使用objectA,如果需要获取,使用objectB进行设置"。如果上面的obj
是地图,或者您可以将地图应用于此对象,那么您可以在with
块中生成地图并使用此地图。如果你必须有嵌套结构,那么还需要做更多的工作。
def jsonParam = new Expando([ p1: 'p1', p2: 'p2', p3: 'p3', ])
def obj = new Expando(
jsonParam.with{
[
param1: p1,
param3: p3,
] // `with` will return this map
})
assert obj.param1==jsonParam.p1
assert obj.param3==jsonParam.p3
我将expandos用于简单代码。
答案 1 :(得分:2)
我想象你的实际出发点如下。在JSON方面:
import groovy.json.JsonSlurper
String jsonText = '''{
"jsonWrap":{
"attrib":{
"something":{
"jsonParam1": "value1",
"jsonParam2": "value2",
"jsonParam3": "value3",
"jsonParam4": "value4",
"jsonParam5": "value5"
}
}
}
}'''
def jsonRequest = new JsonSlurper().parseText(jsonText)
在Groovy方面:
class ObjectType {
def param1, param2, param3, param4, param5
}
def obj = new ObjectType()
现在,如果我对如何定义JSON端或Groovy端有任何控制权,那么我会尽力确保JSON“something”对象的属性名称与属性名称完全相同Groovy“ObjectType”类。例如,像这样:
class ObjectType {
def jsonParam1, jsonParam2, jsonParam3, jsonParam4, jsonParam5
}
然后,将“something”对象解组为Groovy就像这样简单:
def obj = new ObjectType(jsonRequest.jsonWrap.attrib.something)
只有一个对JSON对象的引用。只有一个对Groovy对象的引用。前者用于实例化后者。此外,请注意,根本不需要参考这些属性。也就是说,来自slurper的JSON对象是Map的实例,因此如果属性名称匹配,则可以使用默认的“Map构造函数”语法。
但是,如果您不控制任何一组对象中的属性命名,我仍会建议使用不同的基于Map的快捷方式。首先从一组属性名称到另一组属性名称定义一个常量Map,如下所示:
def map = [param1:"jsonParam1", param2:"jsonParam2", param3:"jsonParam3",
param4:"jsonParam4", param5:"jsonParam5"]
然后我会使用这样的东西来解组对象:
def obj = new ObjectType().with { o ->
jsonRequest.jsonWrap.attrib.something.with { j ->
map.each { oParam, jParam -> o[oParam] = j[jParam] }
}
o
}