Если у меня есть простой объект, например
class Person {
String name
Integer age
}
Я могу легко отобразить его пользовательские свойства как JSON с помощью 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()
Это отлично работает, когда свойства просты, т.е. числа или строки. Однако для более сложного объекта, такого как
class ComplexPerson {
Name name
Integer age
Address address
}
class Name {
String first
String second
}
class Address {
Integer houseNumber
String streetName
String country
}
Есть ли способ, которым я могу пройти весь граф объектов, добавив каждое пользовательское свойство на соответствующем уровне вложенности в JSONBuilder?
Другими словами, для экземпляра ComplexPerson
я хотел бы, чтобы результат был
{
name: {
first: 'john',
second: 'doe'
},
age: 20,
address: {
houseNumber: 123,
streetName: 'Evergreen Terrace',
country: 'Iraq'
}
}
Update
Я не думаю, что могу использовать конвертер Grails JSON для этого, потому что фактическая структура JSON, которую я возвращаю, выглядит примерно как
{ status: false,
message: "some message",
object: // JSON for person goes here
}
Обратите внимание:
- JSON, сгенерированный для
ComplexPerson
, является элементом более крупного объекта JSON - Я хочу исключить определенные свойства, такие как
metaClass
иclass
из преобразования JSON
Если можно получить вывод JSON-конвертера в качестве объекта, я мог бы перебрать его и удалить свойства metaClass
и class
, а затем добавить его к внешнему объекту JSON.
Однако, насколько я могу судить, конвертер JSON, кажется, предлагает подход "всего или ничего" и возвращает его как строку String