Grails JSONBuilder

Se eu tiver um objeto simples como

class Person {
  String name
  Integer age
}

Eu posso renderizar facilmente suas propriedades definidas pelo usuário como JSON usando o JSONBuilder

def person = new Person(name: 'bob', age: 22)

def builder = new JSONBuilder.build {
  person.properties.each {propName, propValue ->

  if (!['class', 'metaClass'].contains(propName)) {

    // It seems "propName = propValue" doesn't work when propName is dynamic so we need to
    // set the property on the builder using this syntax instead
    setProperty(propName, propValue)
  }
}

def json = builder.toString()

Isso funciona bem quando as propriedades são simples, ou seja, números ou seqüências de caracteres. No entanto, para um objeto mais complexo, como

class ComplexPerson {
  Name name
  Integer age
  Address address
}

class Name {
  String first
  String second
}

class Address {
  Integer houseNumber
  String streetName
  String country

}

Existe uma maneira de percorrer todo o gráfico de objetos, adicionando cada propriedade definida pelo usuário no nível de aninhamento apropriado ao JSONBuilde

Em outras palavras, para uma instância deComplexPerson Gostaria que a saída fosse

{
  name: {
    first: 'john',
    second: 'doe'
  },
  age: 20,
  address: {
    houseNumber: 123,
    streetName: 'Evergreen Terrace',
    country: 'Iraq'
  }
}
Atualiza

Acho que não posso usar o conversor JSON Grails para fazer isso, porque a estrutura JSON real que estou retornando parece algo como

{ status: false,
  message: "some message",
  object: // JSON for person goes here 
}

Notar que

O JSON gerado para oComplexPerson é um elemento de um objeto JSON maiorQuero excluir determinadas propriedades, comometaClass eclass da conversão JSON

Se for possível obter a saída do conversor JSON como um objeto, eu poderia iterar sobre isso e remover ometaClass eclass properties e adicione-o ao objeto JSON extern

No entanto, até onde eu sei, o conversor JSON parece oferecer apenas uma abordagem "tudo ou nada" e retorna a saída como uma String

questionAnswers(2)

yourAnswerToTheQuestion