Как использовать groovy builder для создания json-массива?

Мы можем сгенерировать json объектного типа с помощью построителя json groovy:

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 типа массива?


person Freewind    schedule 20.12.2012    source источник


Ответы (3)


Синтаксис, который вы предлагаете, не выглядит возможным, так как я не верю, что он действителен. Закрытие, такое как {"blah":"foo"}, не имеет смысла для groovy, и вы будете ограничены синтаксическими ограничениями. Я думаю, что лучшее, что вы сможете сделать, это что-то из следующего:

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
   ]
)
person Brian Henry    schedule 20.12.2012

также можно создать список замыканий и передать его компоновщику

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()
person Sam Sol    schedule 07.10.2014

Конвертация в итоге мне нравится больше, чем билдер,

def json = [ 
            profile: [
                      _id: profile._id,
                      fullName: profile.fullName,
                      picture: profile.picture
                     ]
            ,title: title
            ,details: details
            ,tags: ["tag1","tag2"]
            ,internalTags: ["test"]
            ,taggedProfiles: []
           ] as JSON
person sumnulu    schedule 21.12.2012
comment
Я могу ошибаться, но я считаю, что конвертер JSON специфичен для Grails. - person Brian Henry; 21.12.2012