如果我有一个简单的对象,例如
class Person {
String name
Integer age
}
我可以使用 JSONBuilder 轻松地将其用户定义的属性呈现为 JSON
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
and class
从 JSON 转换
如果可以将 JSON 转换器的输出作为对象获取,我可以对其进行迭代并删除metaClass
and class
属性,然后将其添加到外部 JSON 对象。
然而,据我所知,JSON 转换器似乎只提供“全有或全无”的方法,并将其输出作为字符串返回