Grails JSONBuilder

Si tengo un objeto simple como

class Person {
  String name
  Integer age
}

Puedo representar fácilmente sus propiedades definidas por el usuario como JSON utilizando el 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()

Esto funciona bien cuando las propiedades son simples, es decir, números o cadenas. Sin embargo, para un objeto más complejo como

class ComplexPerson {
  Name name
  Integer age
  Address address
}

class Name {
  String first
  String second
}

class Address {
  Integer houseNumber
  String streetName
  String country

}

¿Hay alguna manera de que pueda recorrer todo el gráfico de objetos, agregando cada propiedad definida por el usuario en el nivel de anidamiento apropiado al JSONBuilder?

n otras palabras, para una instancia deComplexPerson Me gustaría que la salida sea

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

No creo que pueda usar el convertidor JSON de Grails para hacer esto porque la estructura JSON real que estoy devolviendo se parece a

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

Darse cuenta de

El JSON generado para elComplexPerson es un elemento de un objeto JSON más grande Quiero excluir ciertas propiedades comometaClass yclass de la conversión JSON

Si es posible obtener la salida del convertidor JSON como un objeto, podría iterar sobre eso y eliminar elmetaClass yclass propiedades, luego agréguelo al objeto JSON externo.

in embargo, por lo que puedo decir, el convertidor JSON solo parece ofrecer un enfoque de "todo o nada" y devuelve su salida como una Cadena

Respuestas a la pregunta(2)

Su respuesta a la pregunta