JSON с массивом и не массив данных с Groovy JsonBuilder

Мне нужно создать строку JSON в моем скрипте Groovy, который имеет некоторые элементы, которые являются массивом, а некоторые нет. Например ниже

 {
 "fleet": {
   "admiral":"Preston",
   "cruisers":  [
      {"shipName":"Enterprise"},
      {"shipName":"Reliant"}
   ]
  }
}

Я нашел этот пост, но ответы либо не имели смысла, либо не относились к моему примеру.

Я попробовал ниже в коде...

 def json = new groovy.json.JsonBuilder()
 def fleetStr = json.fleet {
         "admiral" "Preston"
         cruisers {
            {shipName: "[Enterprise]"},  {shipName: "[Reliant]"}
       }
   }

Но это дает исключение...

 Ambiguous expression could be either a parameterless closure expression or an isolated open code block

1 ответ

Решение

В Groovy, {} синтаксис используется для замыканий. Для объектов в JSON вы хотите использовать синтаксис карты [:]и для списков, синтаксис списка []:

def json = new groovy.json.JsonBuilder()
def fleetStr = json.fleet {
    "admiral" "Preston"
    cruisers( [
        [shipName : "[Enterprise]"],
        [shipName: "[Reliant]"]
    ])
}

assert json.toString() == 
    '{"fleet":{"admiral":"Preston","cruisers":[{"shipName":"[Enterprise]"},{"shipName":"[Reliant]"}]}}'

Обновление: согласно вашему продолжению, вы должны использовать тот же синтаксис списка [] вне "[Enterprise]" а также "[Reliant]" строки:

def json = new groovy.json.JsonBuilder()
def fleetStr = json.fleet {
    "admiral" "Preston"
    cruisers( [
        [shipName : ["Enterprise"]],
        [shipName: ["Reliant"]]
    ])
}

assert json.toString() == 
    '{"fleet":{"admiral":"Preston","cruisers":[{"shipName":["Enterprise"]},{"shipName":["Reliant"]}]}}'
Другие вопросы по тегам