2015-01-29 7 views
3

Мне нужно создать простой JSON-массив в JSON, но в цикле он перезаписывает первое значение на каждой итерации.Groovy Simple JSON array builder

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

Он возвращает только простой JSON и перезаписывает значение каждой итерации и сохраняет только последнюю. Каков синтаксис для построения массива JSON в groovy?

ответ

7

Trick - 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" 
     } 
    ] 
} 

Если вы ищете JSONArray вместо JSONObject в качестве окончательного stucture, а затем использовать:

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() 
      ] 
     ] 
    } 
) 
+0

Спасибо дружище, но сейчас я использую импортную net.sf.json.JSONObject import net.sf.json.JSONArray JSONObject obj = new JSONObject(); Список JSONArray = новый JSONArray(); И это решает цель .. – user2093576

2

Использование 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" 
     } 
    ] 
} 
1

Нет непосредственно не отвечает на вопрос (речь шла о 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))