Groovy - 带有多个引用的闭包

时间:2014-11-27 13:48:18

标签: grails groovy

我尝试解析JSON数据并将其分配给Grails中的POJO。

我从

开始
obj.param=jsonRequest.jsonWrap.attrib.something.jsonParam

经过一些实验和重构后,它现在看起来像这样。

jsonRequest.jsonWrap.attrib.something.with {
    obj.param1=jsonParam1
    obj.param2=jsonParam2
    //...
    }
  }

现在,我可以避免重复使用obj引用吗?

2 个答案:

答案 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
}