jsonbuilder: как создать карту объектов
Я пытался создать карту объектов с помощью jsonBuilder уже несколько часов, но безуспешно. Я хочу создать такой json, чтобы я мог адресовать свои объекты следующим образом: someJsonObject.elements.2. Желаемый JSON выглядит следующим образом (это совершенно правильный синтаксис):
{
"elements": {
"1": {
"id": 1,
"x": 111
},
"2": {
"id": 2,
"x": 222
},
"3": {
"id": 3,
"x": 333
}
}
}
Наилучшие результаты, которые я получил за этот код:
builder.elements() {
elementList.each { Element e ->
element( id : e.id, x : e.x )
println "dodano"
}
}
Но все, что я получаю, это только один элемент, напечатанный в моем json:
{
"elements": {
"element": {
"id": 3,
"x": 333
}
}
}
Если бы я только мог назвать свои объекты динамически, например, так:
builder.elements() {
elementList.each { Element e ->
e.id( id : e.id, x : e.x )
println "dodano"
}
}
но он выдает ошибку: нет подписи метода: com.webwaver.website.Element.id() применим к типам аргументов: (java.util.LinkedHashMap) значения: [[id:3, x:748]]
У кого-нибудь есть идеи, как получить желаемый JSON?
РЕДАКТИРОВАТЬ: Спасибо за ответ. Это очень помогает, но так как я не могу использовать вызов метода builder.elements(), у меня все еще есть проблема с созданием json, это выглядело бы так:
{
"data": {
"lastPageNr": 1,
"lastLanguageId": 1,
"lastElementNr": 0,
"websiteId": "nrpntf"
},
"elements": {
"1": {
"id": 1,
"x": 111
},
"2": {
"id": 2,
"x": 222
},
"3": {
"id": 3,
"x": 333
}
}
}
есть идеи?
1 ответ
Это дает вам вывод, который вы хотите:
import groovy.json.*
def builder = new JsonBuilder()
builder.elements {
"1" {
id 1
x 111
}
"2" {
id 2
x 222
}
"3" {
id 2
x 222
}
}
println builder.toPrettyString()
Так что вы хотите, чтобы ваш построитель на основе списка был что-то вроде:
def elementList = [ [ id: 3, x:748 ], [ id: 4, x:222 ] ]
def builder = new JsonBuilder()
builder.elements {
elementList.each { e ->
"$e.id" {
id e.id
x e.x
}
}
}
println builder.toPrettyString()
Изменить - после того, как вы изменили вопрос:
def builder = new JsonBuilder()
builder {
data {
lastPageNr 1
lastLanguageId 1
lastElementNr 0
websiteId 'nrpntf'
}
elements {
elementList.each { e ->
"$e.id" {
id e.id
x e.x
}
}
}
}
println builder.toPrettyString()