2012-12-20 73 views
13

我们可以通过生成Groovy的JSON建设者的对象类型JSON:如何使用groovy builder生成一个数组类型的json?

def builder = new groovy.json.JsonBuilder() 
def root = builder.people { 
    person { 
     firstName 'Guillame' 
     lastName 'Laforge' 
     // Named arguments are valid values for objects too 
     address(
       city: 'Paris', 
       country: 'France', 
       zip: 12345, 
     ) 
     married true 
     // a list of values 
     conferences 'JavaOne', 'Gr8conf' 
    } 
} 
def jsonStr = builder.toString() 

我喜欢这种类型的语法,而是如何建立一个数组类型JSON?

E.g.

[ 
    {"code": "111", "value":"222"}, 
    {"code": "222", "value":"444"} 
] 

我发现了一些文件,其中说我们应该用JsonBuilder()构造:

def mydata = [ ["code": "111", "value":"222"],["code": "222", "value":"444"] ] 
def builder = new groovy.json.JsonBuilder(mydata) 
def jsonStr = builder.toString() 

但我更喜欢第一种语法。它能够使用它生成数组类型的JSON吗?

回答

7

你提出的语法看起来不太可能,因为我不相信它是有效的常规。关闭如{"blah":"foo"}对于常规来说没有意义,并且您将受到语法限制的限制。我认为你要能够做到最好的是以下中的东西:

def root = builder.call (
    [ 
     { 
     code "111" 
     value "222" 
     }, 
     {code "222"; value "444"}, //note these are statements within a closure, so ';' separates instead of ',', and no ':' used 
     [code: "333", value:"555"], //map also allowed 
     [1,5,7]      //as are nested lists 
    ] 
) 
0

我喜欢在年底超过建设者转换,

def json = [ 
      profile: [ 
         _id: profile._id, 
         fullName: profile.fullName, 
         picture: profile.picture 
        ] 
      ,title: title 
      ,details: details 
      ,tags: ["tag1","tag2"] 
      ,internalTags: ["test"] 
      ,taggedProfiles: [] 
      ] as JSON 
+3

我可能是错的,但我相信JSON转换器是特定于Grails的。 –

+0

@BriaHenry正确的是,“grails.converters.JSON” – sumnulu

2

,也可以创建列表关闭并将其传递给构建器

import groovy.json.* 

dataList = [ 
    [a:3, b:4], 
    [a:43, b:3, c:32] 
] 
builder = new JsonBuilder() 
builder { 
    items dataList.collect {data -> 
     return { 
      my_new_key '' 
      data.each {key, value -> 
       "$key" value 
      } 
     } 
    } 
} 
println builder.toPrettyString() 
相关问题