Mapオブジェクトの値取得にワイルドカードを使用してアクセスする関数を実装する。
import groovy.json.*
String json = '''
{
"reward_id_1": 100,
"reward_id_2": 200,
"reward_id_3": 300,
"other1": 10,
"other2": 20,
"other3": 30
}
'''
Map propertyMap(obj, String property) {
property = property.replace("*", ".*")
return obj.keySet()
.findAll({ it ==~ /${property}/ })
.collectEntries([:] as LinkedHashMap, { p -> ["$p": obj."$p"] })
}
def obj = new JsonSlurper().parseText(json)
println obj
// ==> [other1:10, other2:20, other3:30, reward_id_1:100, reward_id_2:200, reward_id_3:300]
println propertyMap(obj, "reward_id_*")
// ==> [reward_id_1:100, reward_id_2:200, reward_id_3:300]
propertyMap(obj, "reward_id_*").each { key, rewardId ->
println rewardId
}
// ==> 100
// ==> 200
// ==> 300
propertyMapという関数に、ワイルドカードで指定したキー名を渡すと、マップにして返してくれます。
後々、連番が増えたりしても修正しなくてよいので便利かと。。
追記:
オブジェクトに対してfindAllだけで、実現できる事に気づいた。
Map propertyMap(obj, String property) {
property = property.replace("*", ".*")
obj.findAll { it ==~ /${property}/ }
}
ワイルドカードではなく正規表現をそのまま使うのであれば、下記一行のみでOKだった。。
it には Entryのオブジェクトが渡っているけど、マッチ演算時ではkey名で評価されているみたい。
println obj.findAll { it ==~ /reward_id_.*/ }
// ==> [reward_id_1:100, reward_id_2:200, reward_id_3:300]
最終的には、わざわざ関数作らなくても既存のGroovyメソッドで事足りるんですね。
Groovyすごいな〜
0 件のコメント:
コメントを投稿