JSON 使用数组和非数组数据 Groovy JsonBuilder

JSON with array and non-array data with Groovy JsonBuilder

我需要在我的 Groovy 脚本中创建一个 JSON 字符串,其中一些元素是数组,一些不是。例如下面的..

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

我找到了 this post,但答案要么没有意义,要么不适用于我的示例。

我在代码中尝试了以下...

 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

在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"]}]}}'