2

外部ソース、主に 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'

ただし、「owners」を「ownerInfo」に変更すると、上記のアクセスで 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
4

2 に答える 2