2012-12-21 2 views
11

Ich möchte ein Array mit JSON-Builder erstellen.Wie verwende ich groovy jsonbuilder mit .each, um ein Array zu erstellen?

Expected Format:

{ 
    "Header": { 
    "SomeKey" : "SomeValue" 
} 
    "Data": [ 
    { 
     "SomeKey" : "SomeValue" 
    }, 
    { 
    "SomeKey" : "SomeValue" 
    } 
    ] 
} 

Mein Code:

def builder = new groovy.json.JsonBuilder() 

    def root = builder { 
     Header {    
     "Typ" "update" 
     "Code" "UTF-8" 
     "TransaktionsNr" item.transactionNumber 
     "DatumZeit" new Date().format("dd.MM.yyyy HH:mm") 
    } 

    customers.each ({ customer->   
     "Data" { 
      "Email" customer.code 
      "Newsletter" customer.newsletterSubscribed 
     } 
    }) 

aber, was ich bekomme ich nur ein Element im Datenbereich. Ich habe versucht, [] anstelle von {} zu verwenden, aber ich bekomme immer noch nur ein Element, was mache ich falsch?

+0

Ich sollte hinzufügen, dass ich jede oder um genau zu sein, einen Verschluß zu verwenden, die die Objekte aus einer Datenbank erhält. ‚EachItem (‚Kunde‘, {Kunde ->‘ – Fels

Antwort

6

Das ist doppelte Schlüssel für JSON-Struktur. There should not be duplicate key in the same hierarchy or they will override each other:

class Customer { String code; boolean newsletterSubscribed } 

customers = [ 
    new Customer(code:"11111", newsletterSubscribed:true), 
    new Customer(code:"22222", newsletterSubscribed:false) 
] 

def builder = new groovy.json.JsonBuilder() 

def root = builder { 
    Header {    
    "Typ" "update" 
    "Code" "UTF-8" 
    "TransaktionsNr" 987 
    "DatumZeit" new Date().format("dd.MM.yyyy HH:mm") 

    } 

    customers customers.collect { customer -> 
     ["Email":customer.code, 
     "Newsletter":customer.newsletterSubscribed] 
    } 

} 

assert builder.toString() == {"Header":{"Typ":"update","Code":"UTF-8","TransaktionsNr":987,"DatumZeit":"21.12.2012 13:38"},"Data":{"Email":"22222","Newsletter":false},"customers":[{"Email":"11111","Newsletter":true},{"Email":"22222","Newsletter":false}]} 
+0

Dank Ich habe Angst, dass ich Das Problem ist, dass ich dies bei 1,5 Millionen Kunden verwende und es gibt mehr Felder als in meinem Beispiel. Ich glaube nicht, dass ich das alles im Speicher halten kann, also denke ich, dass ich meine schreiben muss Ja, aber danke trotzdem. – Fels

+0

Was ist mit StreamingJsonBuilder (http://groovy.codehaus.org/gapi/groovy/json/StreamingJsonBuilder.html)? – Will

+1

Danke, ich wusste nicht einmal darüber. Ich * sollte * in der Lage sein, die gesamte Kundenliste im Speicher zu haben, wenn ich nicht die gesamte JSON-Struktur haben muss. Jetzt wäre es perfekt, wenn es jemand wäre wusste, wie man das exportiert, ohne alle Daten vor dem Export in einer Liste zu haben :) – Fels