【发布时间】:2011-07-29 03:32:45
【问题描述】:
如果我有一个简单的对象,例如
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'
}
}
更新
我认为我不能使用 Grails JSON 转换器来执行此操作,因为我返回的实际 JSON 结构看起来类似于
{ status: false,
message: "some message",
object: // JSON for person goes here
}
注意:
- 为
ComplexPerson生成的 JSON 是更大 JSON 对象的一个元素 - 我想从 JSON 转换中排除某些属性,例如
metaClass和class
如果可以将 JSON 转换器的输出作为对象获取,我可以对其进行迭代并删除 metaClass 和 class 属性,然后将其添加到外部 JSON 对象。
然而,据我所知,JSON 转换器似乎只提供“全有或全无”的方法,并将其作为字符串返回输出
【问题讨论】:
-
person as grails.converters.JSON不会为你走树吗?我一直认为它确实(但从未尝试过) -
确实如此,但我想在输出中添加一些额外的属性,同时排除
class、metaClass和其他一些属性。转换器似乎提供了一种“全有或全无”的方法,这就是为什么我想用构建器来代替。