Я создал класс, который позволяет результирующему объекту добавлять к нему произвольные свойства. У класса также есть некоторые предопределенные свойства. В методе класса я хочу иметь возможность перебирать все свойства, принадлежащие экземпляру объекта.
Вот пример определения класса:
import groovy.json.*
class Foo {
private Map props = [:]
String bar = "baz"
def myNumber = 42
void propertyMissing(String name, Object value) {
this.props[name] = value
}
def propertyMissing(String name) {
return this.props[name]
}
def toJsonString() {
def outObject = [:]
// I want to do something like this
this.properties.each { k, v ->
if (this.isOwnProperty(k) && k != 'props') {
outObject[k] = v
}
}
outObject = outObject + this.props
return JsonOutput.toJson(outObject)
// Should return a string like:
// {"bar":"baz", "myNumber":42, "someDynamicProperty":"value"}
//
// This string should not contain the "class" and "metaClass"
// properties.
}
}
Есть ли способ сделать то, что я хочу?
Изменить:
Одна из моих целей - не указывать явное имя мои предопределенные свойства в методе toJsonString
. Я хочу иметь возможность добавлять новые предопределенные свойства позже, не забывая об обновлении метода toJsonString
.
Изменить (24 октября 2011 г.):
Принятый ответ дал мне необходимую информацию. Однако мне по-прежнему требовалось указать свойства, которые я не хочу включать в строку JSON. Небольшое расширение ответа решает эту проблему:
def outObject = Foo.declaredFields.findAll {
// 'it' is a Field object returned by
// http://download.oracle.com/javase/1,5,0/docs/api/java/lang/Class.html#getDeclaredFields()
!it.synthetic &&
it.getModifiers() != java.lang.reflect.Modifier.PRIVATE
}.collectEntries { v ->
[ (v.name) : this[v.name] ]
}
Чтобы это работало, вы должны явно указать модификаторы для свойств вашего класса. То есть String bar = "baz"
в моем примере должно быть public String bar = "baz"
, чтобы оно было включено в строку JSON.