Groovy 创建一个具有键的对象,其中值是数组
基本上,我希望以某种方式从Groovy对象创建一个JSON对象。Groovy对象有键值对,其中一个值是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
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
)。