我正在抓取外部资源,主要是 JSON。我new JsonSlurper().parse(body)用来解析它们,并使用诸如def name = json.user[0].name. 这些是外部的,可以在没有通知的情况下更改,所以我希望能够检测到这一点并以某种方式记录它。
在阅读了一些关于 MOP 的信息后,我认为如果缺少属性,我可以更改地图和列表的适当方法以记录。我只想json递归地执行对象及其属性。问题是,我不知道该怎么做。
或者,有没有更好的方法来完成这一切?
[编辑] 例如,如果我得到这个 JSON:
def json = '''{
"owners": [
{
"firstName": "John",
"lastName": "Smith"
},
{
"firstName": "Jane",
"lastName": "Smith"
}
]
}'''
def data = new groovy.json.JsonSlurper().parse(json.bytes)
assert data.owners[0].firstName == 'John'
但是,如果他们将“所有者”更改为“所有者信息”,则上述访问将引发 NPE。我想要的是拦截访问并做一些事情(比如将它记录在一个特殊的日志中,或者其他什么)。我也可以决定抛出一个更专业的异常。
我不想捕获 NullPointerException,因为它可能是由我的代码中的一些错误而不是更改的数据格式引起的。此外,如果他们将“firstName”更改为“givenName”,但保留“owners”名称,我只会得到一个null值,而不是NPE. 理想情况下,我也想检测这种情况。
如果可能的话,我也不想放置很多 if 或 evlis 运算符。
我实际上设法拦截了地图:
data.getMetaClass().getProperty = {name -> println ">>> $name"; delegate.get(name)}
assert data.owners // this prints ">>> owners"
我仍然无法找到如何为列表执行此操作:
def owners = data.owners
owners.getMetaClass().getAt(o -> println "]]] $o"; delegate.getAt(o)}
assert owners[0] // this doesn't print anything