2015-01-29 1 views
3

JSON에서 간단한 JSON 배열을 작성해야하지만 루프에서 매 반복마다 첫 번째 값을 덮어 씁니다.Groovy 간단한 JSON 배열 빌더

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

단순한 JSON 만 반환하고 모든 반복의 값을 덮어 쓰며 마지막 반복 만 유지합니다. groovy에서 JSON Array를 생성하기위한 구문은 무엇입니까?

답변

7

트릭은 연락처 목록에서 collect입니다. contract 목록의 구조가 다음과 같다고 가정하면 아래의 방법으로 jsonBuilder을 사용하십시오. 당신이 최종 stucture로 대신 된 JSONObject의 JSONArray를 찾고 있다면

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

, 다음 사용 : 구조처럼 필요한 경우 그것은 이해하지 않지만

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 list = 새 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에 대해이었다) 그러나 목표는 경우 얻을 수 JsonOutput를 사용하여 문자열은 다음과 같은 방법으로 수행 할 수있는 JSON 출력 (@dmahapatro 대답에서 차용 코드의 일부) :

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