Grails Groovy-具有多个引用的闭包
我试图解析JSON数据并将其分配给Grails中的POJO 我从Grails Groovy-具有多个引用的闭包,grails,groovy,Grails,Groovy,我试图解析JSON数据并将其分配给Grails中的POJO 我从 obj.param=jsonRequest.jsonWrap.attrib.something.jsonParam 经过一些实验和重构,现在看起来是这样的 jsonRequest.jsonWrap.attrib.something.with { obj.param1=jsonParam1 obj.param2=jsonParam2 //... } } 现在,我可以避免重复使用obj引用吗?我
obj.param=jsonRequest.jsonWrap.attrib.something.jsonParam
经过一些实验和重构,现在看起来是这样的
jsonRequest.jsonWrap.attrib.something.with {
obj.param1=jsonParam1
obj.param2=jsonParam2
//...
}
}
现在,我可以避免重复使用obj引用吗?我不认为有什么简单的方法可以欺骗groovy“如果需要获取,就使用objectA,如果需要设置,就使用objectB”。如果上面的
obj
是一个贴图,或者您可以将贴图应用于此对象,那么您可以使用块在中生成一个贴图并使用它。如果必须有嵌套结构,则需要进行更多的工作
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编写简单的代码。我认为没有一种简单的方法可以欺骗groovy“如果需要获取,就使用objectA,如果需要设置,就使用objectB”。如果上面的obj
是一个贴图,或者您可以将贴图应用于此对象,那么您可以使用块在中生成一个贴图并使用它。如果必须有嵌套结构,则需要进行更多的工作
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编写简单的代码。我想象您的实际出发点如下。在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构造函数”语法
但是,如果在这两组对象中都不控制属性命名,我仍然建议使用不同的基于地图的快捷方式。首先定义从一组属性名称到另一组属性名称的常量映射,如下所示:
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
}
我想象你的实际出发点如下。在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构造函数”语法
但是,如果在这两组对象中都不控制属性命名,我仍然建议使用不同的基于地图的快捷方式。首先定义从一组属性名称到另一组属性名称的常量映射,如下所示:
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
}
带有param1=…
的两行是复制和粘贴错误?为什么jsonRequest.with{jsonWrap.attrib.something.with{
而不仅仅是jsonRequest.jsonWrap.attrib.something.with{
?@cfrick有两行是打字错误。@BalRogjsonRequest.jsonWrap.attrib.something.with{
也很好。编辑了代码。难道你不能直接使用吗?param1=…
的两行是复制和粘贴错误?为什么jsonRequest.with{jsonWrap.attrib.something.with{
而不是jsonRequest.jsonWrap.attrib.something.with{
?@cfrick两行输入错误。@BalRogjsonRequest.jsonWrap.attrib.something.with{
也可以。编辑了代码。你不能直接使用吗?