2017-06-15 12 views
0

JSONObjectのメタクラスをGroovyで修正して、通常のGroovyマップのようにできるだけ動作させようとしています。メタクラスにメソッドを実装すると、以下の例のJSONObject.metaClass.sizeのような単純なメソッドがあります。 JSONObjectにはlength()メソッドがあり、新しいsize()メソッドまで配線していますが、いくつかのメソッドには特別な意味があります。たとえば、添字割り当てを機能させるには、putAtではなく、propertyMissingをオーバーライドする必要がありました。それは、collect、findAllなどのようなコレクション操作の多くが似ているように見えます。Groovyメタクラスを使用して特殊メソッドを実装する

私の最初の質問は、それぞれの()を動作させるためにこの場合にどのような特別なメソッドを必要としますか?私の2番目の質問は、自分自身で答えをどうやって見つけ出すかです。 MOPから特別な扱いを受けるメソッドのどこかにリファレンスがありますか? groovy-coreのソースコードを見てみましたが、そこにはたくさんのものがあり、どこから始めるべきかわかりません。

JSONObject.metaClass.propertyMissing = { String name, newValue -> delegate.put(name, newValue) } 
JSONObject.metaClass.size = { -> delegate.length() } 
JSONObject.metaClass.each = { cl -> delegate.keys().collectEntries{ [(it): delegate[it] ]}.each(cl) } 

def json = new JSONObject() 
json['a'] = 999 
json.b = 2.2 
json['c'] = 'the letter C' 
println json['a']   // Prints 999 
println json['b']   // Prints 2.2 
println json.c    // 'the letter C' 
println json.size()   // Prints 3 

//No signature of method: ... $__spock_feature_0_0_closure4.doCall() is applicable 
json.each{ k,v -> println "$k = $v"} 
+0

?あなたは完全なクラス名を与えることができますか? – daggett

+0

org.json.JSONArrayとorg.json.JSONObject from 'org.json:json:20160810' –

答えて

2
@Grab(group='org.json', module='json', version='20160810') 

import org.json.JSONArray 
import org.json.JSONObject 

JSONObject.metaClass.each={Closure c-> 
    delegate.keys().each{ k-> c(k, delegate.get(k)) } 
} 

JSONObject.metaClass.setProperty={String k, Object v-> 
    delegate.put(k,v) 
} 

JSONObject.metaClass.getProperty={String k-> 
    delegate.get(k) 
} 

JSONObject.metaClass.size = { -> delegate.length() } 

def json = new JSONObject() 
json['a'] = 999 
json.b = 2.2 
json['c'] = 'the letter C' 
println json['a']   // Prints 999 
println json['b']   // Prints 2.2 
println json.c    // 'the letter C' 
println json.size()   // Prints 3 

//No signature of method: ... $__spock_feature_0_0_closure4.doCall() is applicable 
json.each{ k,v -> println "$k = $v"} 

出力:JSONObject

999 
2.2 
the letter C 
3 
a = 999 
b = 2.2 
c = the letter C 
+0

これは動作します:)ありがとう!私はそれが多かれ少なかれ正しい方法に近づいていたと思うが、私は正しく各閉鎖を書いていない。 –

関連する問題