Надеюсь, что это работает, я думаю, что вы можете создать очень индивидуальный конвертер с этим, чтобы он делал то, что вам нужно :-)
у меня есть простой объект, такой как
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'
}
}
ОбновитьЯ не думаю, что смогу использовать для этого JSON-конвертер Grails, потому что реальная структура JSON, которую я возвращаю, выглядит примерно так
{ status: false,
message: "some message",
object: // JSON for person goes here
}
Заметить, что:
JSON, сгенерированный дляComplexPerson
является элементом большего объекта JSONЯ хочу исключить некоторые свойства, такие какmetaClass
а такжеclass
из преобразования JSONЕсли возможно получить выходные данные преобразователя JSON в виде объекта, я мог бы выполнить итерацию и удалитьmetaClass
а такжеclass
свойства, затем добавьте его во внешний объект JSON.
Однако, насколько я могу судить, JSON-конвертер предлагает только подход «все или ничего» и возвращает его вывод в виде строки.