Groovy 创建一个具有键的对象,其中值是数组

Groovy 创建一个具有键的对象,其中值是数组,groovy,Groovy,基本上,我希望以某种方式从Groovy对象创建一个JSON对象。Groovy对象有键值对,其中一个值是Groovy数组: import groovy.json.* // Imagine "handler" gets called somehow and an event gets passed to it. def handler(event) { def capabilitiesList = event.device.capabilities.findAll

基本上,我希望以某种方式从Groovy对象创建一个JSON对象。Groovy对象有键值对,其中一个值是Groovy数组:

   import groovy.json.*

   // Imagine "handler" gets called somehow and an event gets passed to it.
   def handler(event) {
       def capabilitiesList = event.device.capabilities.findAll { attr -> attr.name != null }
       def json = new JsonBuilder({
           id event.deviceId
           displayName event.displayName
           value event.value
       })
   }

   log.debug capabilitiesList
   log.debug json.toPrettyString()
此时,
json.toPrettyString()
告诉我:

   {
       "id": "asdfl469934623sdglsi3aqaq",
       "displayName": "Some Lightbulb",
       "value": "on"
   }
   ["Test 1", "Test 2", "Test 3"]
capabilitiesList
为我提供了以下信息:

   {
       "id": "asdfl469934623sdglsi3aqaq",
       "displayName": "Some Lightbulb",
       "value": "on"
   }
   ["Test 1", "Test 2", "Test 3"]
如何将
capabilitiesList
数组添加到Groovy对象中,以便将其转换为JSON

我似乎什么也做不到;唯一有效的方法是:

   // ...
   def json = new JsonBuilder({
       id event.deviceId
       displayName event.displayName
       value event.value
       capabilitiesList "Test 1", "Test 2", "Test 3"
   })
   // ...
这给了我这个(正确的)JSON输出:

   {
       "id": "asdfl469934623sdglsi3aqaq",
       "displayName": "Some Lightbulb",
       "value": "on",
       "capabilitiesList": ["Test 1", "Test 2", "Test 3"]
   }
但这显然没有用,因为它是硬编码的。所以我尝试直接引用数组,如下所示:

   // ...
   def capabilitiesList = event.device.capabilities.findAll { attr -> attr.name != null }
   def json = new JsonBuilder({
       id event.deviceId
       displayName event.displayName
       value event.value
       capabilitiesList capabilitiesList
   })
   // ...
但这在某种程度上破坏了
JsonBuilder
,并且它没有输出任何东西


我可能在做一些非常愚蠢的事情,但我不太明白如何做到这一点。也是第一次使用Groovy。谢谢你的帮助

使用构建器DSL应该可以工作。例如:

List list = ['Test1', 'Test2', 'Test3']

def builder = new groovy.json.JsonBuilder()

builder {
   id "asdfl469934623sdglsi3aqaq"
   displayName "Some Lightbulb"
   value "on"
   capabilitiesList list
}

println builder.toPrettyString()
印刷品

{
    "id": "asdfl469934623sdglsi3aqaq",
    "displayName": "Some Lightbulb",
    "value": "on",
    "capabilitiesList": [
        "Test1",
        "Test2",
        "Test3"
    ]
}

谢谢你的回答!但是,在我的问题示例中,
事件
变量中有一个列表。将其插入
builder
对象不起作用。手动定义它会破坏整个目的,因为我想使用从
事件
对象传递下来的列表。谢谢第二次使用
capabilitiesList
而不是上次代码片段中的
capabilities
。第一次将被解释为JSON属性的名称;第二次将被解释为Groovy列表变量,转换为JSON列表。哦,对不起,这是我的错误。当我执行上面描述的操作时,它无法在
toPrettyString()
中输出字符串:(嗯,这里发生了一些奇怪的事情。请尝试以下操作:将声明从
def capabilitiesList
更改为
List capabilitiesList
,然后告诉我发生了什么。另一个尝试是:在
JsonBuilder
中使用spread(
*
)操作符,如下所示:
capabilitiesList*capabilitiesList
)。