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'
}
}
AtualizaAcho 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 JSONSe 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