Grails Groovy-具有多个引用的闭包

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引用吗?我

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

我从

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有两行是打字错误。@BalRog
jsonRequest.jsonWrap.attrib.something.with{
也很好。编辑了代码。难道你不能直接使用吗?
param1=…
的两行是复制和粘贴错误?为什么
jsonRequest.with{jsonWrap.attrib.something.with{
而不是
jsonRequest.jsonWrap.attrib.something.with{
?@cfrick两行输入错误。@BalRog
jsonRequest.jsonWrap.attrib.something.with{
也可以。编辑了代码。你不能直接使用吗?