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'
}
}
ActualizaNo 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