创建一个对象,其中的值是一个数组
问题描述:
基本上,我想以某种方式从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"
}
而且capabilitiesList
给了我这样的:
["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"
]
}
+0
感谢您的回答!然而我有一个列表,它在我的问题示例中的'event'变量中,将它插入'builder'对象不起作用。手动定义它会破坏整个目的,因为我想使用从'events'对象传出的列表。谢谢! – Titus
而是在你最后的代码片断capabilities'的',用'capabilitiesList'第二次。第一次将被解释为JSON属性的名称;第二次将被解释为要转换为JSON列表的Groovy列表变量。 – BalRog
哦,对不起,这是我的错误。当我按照上面的描述进行操作时,它不会在'toPrettyString()'中输出一个字符串。 :( – Titus
嗯,这里有一些奇怪的事情,试试这个:将声明从'def capabilitiesList'更改为'Lists capabilitiesList'并告诉我会发生什么 –
BalRog