2012-12-21 13 views
11

Vorrei creare un array con JSON-Builder.Come utilizzare groovy jsonbuilder con .each per creare un array?

formato previsto:

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

My 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 
     } 
    }) 

Tuttavia qualunque cosa io faccia Ho solo un elemento nella sezione Dati. Ho provato a usare [] invece di {}, ma ho ancora solo un elemento, cosa sto facendo male?

+0

Vorrei aggiungere che devo usare ciascuno o per essere precisi una chiusura che ottiene gli oggetti da un database:. 'EachItem ('cliente', {cliente ->' – Fels

risposta

6

Questa è la chiave duplicata per la struttura JSON. 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

Grazie Avevo paura devo fare qualcosa del genere Il problema è che sto usando questo su 1.5 milioni di clienti e ci sono più campi che nel mio esempio. Non penso di poter tenere tutto questo in memoria, quindi penso di dover scrivere il mio proprio json writer Ma grazie comunque – Fels

+0

Che dire di StreamingJsonBuilder (http://groovy.codehaus.org/gapi/groovy/json/StreamingJsonBuilder.html)? – Will

+1

Grazie, non lo sapevo nemmeno io. essere in grado di avere l'intera lista clienti in memoria se non devo avere l'intera struttura JSON. Ora sarebbe perfetto se qualcuno sapevo come esportare questo senza la necessità di avere tutti i dati in una lista prima dell'esportazione :) – Fels

Problemi correlati