JSONで単純なJSON配列を作成する必要がありますが、ループでは、反復ごとに最初の値が上書きされます。
def jsonBuilder = new groovy.json.JsonBuilder()
contact.each {
jsonBuilder.contact(
FirstName: it.getFirstName(),
LastName: it.getLastName(),
Title: it.getTitle(),
)
}
単純なJSONのみを返し、すべての反復の値を上書きし、最後の反復のみを保持します。 groovyでJSON配列を構築するための構文は何ですか?
秘訣は、連絡先のリストからcollect
することです。 contract
リストの構造が以下のようになっていると仮定して、以下のjsonBuilder
の使用方法に従います。
def contact = [
[ getFirstName : { 'A' }, getLastName : { 'B' }, getTitle : { 'C' } ],
[ getFirstName : { 'D' }, getLastName : { 'E' }, getTitle : { 'F' } ],
[ getFirstName : { 'G' }, getLastName : { 'H' }, getTitle : { 'I' } ]
]
def jsonBuilder = new groovy.json.JsonBuilder()
jsonBuilder {
contacts contact.collect {
[
FirstName: it.getFirstName(),
LastName: it.getLastName(),
Title: it.getTitle()
]
}
}
println jsonBuilder.toPrettyString()
// Prints
{
"contacts": [
{
"FirstName": "A",
"LastName": "B",
"Title": "C"
},
{
"FirstName": "D",
"LastName": "E",
"Title": "F"
},
{
"FirstName": "G",
"LastName": "H",
"Title": "I"
}
]
}
最終的な構造としてJSONObjectではなくJSONArrayを探している場合は、次を使用します。
jsonBuilder(
contact.collect {
[
FirstName: it.getFirstName(),
LastName: it.getLastName(),
Title: it.getTitle()
]
}
)
// OP
[
{
"FirstName": "A",
"LastName": "B",
"Title": "C"
},
{
"FirstName": "D",
"LastName": "E",
"Title": "F"
},
{
"FirstName": "G",
"LastName": "H",
"Title": "I"
}
]
それは意味がありませんが、以下のような構造が必要な場合
[
{
"contact": {
"FirstName": "A",
"LastName": "B",
"Title": "C"
}
},
{
"contact": {
"FirstName": "D",
"LastName": "E",
"Title": "F"
}
},
{
"contact": {
"FirstName": "G",
"LastName": "H",
"Title": "I"
}
}
]
次に使用する
jsonBuilder(
contact.collect {
[
contact : [
FirstName: it.getFirstName(),
LastName: it.getLastName(),
Title: it.getTitle()
]
]
}
)
JsonBuilderの使用は、.each
ではうまく機能しません。私はこの種のことにcollect
を使用しました。以下はあなたのケースでうまくいくはずの例です:
static class Contact {
String firstName
String lastName
String title
}
Contact c1 = new Contact(firstName: "Tom", "lastName": "Potter", title: "Mr")
Contact c2 = new Contact(firstName: "Ryan", "lastName": "Olson", title: "Mr")
List<Contact> contactList = [c1,c2]
def jsonBuilder = new groovy.json.JsonBuilder()
jsonBuilder {
contacts(contacts.collect{[firstName: it.firstName, lastName: it.lastName, title: it.title]})
}
println jsonBuilder.toPrettyString()
この結果は次のとおりです。
{
"contacts": [
{
"firstName": "Tom"
},
{
"firstName": "Ryan"
}
]
}
質問に直接答えることはできませんが(JsonBuilderに関するものでした)、JSON出力を文字列で取得することが目標である場合は、次の方法(@dmahapatro回答から借用したコードの一部)で JsonOutput を使用して行うことができます。 =:
import groovy.json.JsonOutput
def contacts = [
[ getFirstName : { 'A' }, getLastName : { 'B' }, getTitle : { 'C' } ],
[ getFirstName : { 'D' }, getLastName : { 'E' }, getTitle : { 'F' } ],
[ getFirstName : { 'G' }, getLastName : { 'H' }, getTitle : { 'I' } ]
]
def list = ['contacts': contacts.collect { [FirstName: it.getFirstName(), LastName: it.getLastName(), Title: it.getTitle()] } ]
print JsonOutput.prettyPrint(JsonOutput.toJson(list))