2017-01-01 137 views
0

基本上,我想以某种方式从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也是第一次。谢谢您的帮助!

+0

而是在你最后的代码片断capabilities'的',用'capabilitiesList'第二次。第一次将被解释为JSON属性的名称;第二次将被解释为要转换为JSON列表的Groovy列表变量。 – BalRog

+0

哦,对不起,这是我的错误。当我按照上面的描述进行操作时,它不会在'toPrettyString()'中输出一个字符串。 :( – Titus

+0

嗯,这里有一些奇怪的事情,试试这个:将声明从'def capabilitiesList'更改为'Lists capabilitiesList'并告诉我会发生什么 – BalRog

回答

0

使用生成器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

相关问题