web-dev-qa-db-ja.com

Groovy SimpleJSON配列ビルダー

JSONで単純なJSON配列を作成する必要がありますが、ループでは、反復ごとに最初の値が上書きされます。

def jsonBuilder = new groovy.json.JsonBuilder()
contact.each {
            jsonBuilder.contact(
                    FirstName:  it.getFirstName(),
                    LastName:  it.getLastName(),
                    Title: it.getTitle(),       
            )
    }

単純なJSONのみを返し、すべての反復の値を上書きし、最後の反復のみを保持します。 groovyでJSON配列を構築するための構文は何ですか?

8
user2093576

秘訣は、連絡先のリストから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() 
            ] 
        ]
    }
)
14
dmahapatro

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"
        }
    ]
}
2
Durandal

質問に直接答えることはできませんが(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))
2
Opal