2017-12-05 7 views
0

私はいくつかのサードパーティのAPIを介してオブジェクトを取得します。私はそれを取得し、そのプロパティからマップを返すようにラッパー関数を使用します。オブジェクトのプロパティからマップを作成するにはどうすればよいですか?

wrapperFunc() { 
    def myObj = someapi.getblah().getSomeObect() 
    return [ 
     aaa: myObj.aaa, 
     bbb: myObj.bbb, 
     ccc: myObj.ccc 
    ] 
} 

は今、私は手動でこのようなオブジェクト内のすべてのプロパティを介して行くことができますが、動的にマップを構築するためのエレガントなグルーヴィーな機能がありますオブジェクトのプロパティから?

答えて

1

あなたはこのような何かを行うことができます。

まず、タイプのプロパティにアクセスするためのGroovy MetaClassを使用して、オブジェクト・ツー・地図ロジックを含むクラスを作成します。 findAllは、「クラス」プロパティをフィルタリングし、私はあなたが気にしないと仮定しています。 collectEntriesラインは、マップエントリに各MetaPropertyオブジェクトを変換します。

def obj = someapi.getBlah().getSomeObject() 
use (ElegantGroovyFeature) { 
    def mapOfProperties = obj as Map 
} 
+0

これは私にとってはうまくいかないようですが、多分私は理解できません。私はそれを実行し、props.oneOfMyPropsを行うと、それは財産が本当に 'null'なので価値を持っていない限りだろう、なぜ私は理解していない – red888

+0

nullです。申し訳ありませんが私は助けることはできません。運が良かった! –

-1

CONST OBJ = {FOO 'バー'、バズ:42}。 const map =新しいマップ(Object.entries(obj)); console.log(map); //地図{FOO: "バー"、BA enter code here Z:42}:

class Widget { 
    int width 
    int height 

    static void main(args) { 
     def obj = new Widget(width: 7, height: 9) 

     List<MetaProperty> metaProperties = obj.metaClass.properties 

     def props = [:] 
     for(MetaProperty mp : metaProperties) { 
      props[mp.name] = mp.getProperty(obj) 
     } 

     // props will look like [width:7, class:class demo.Widget, height:9] 
    } 
} 
+0

'constのマップ=新しい地図(Object.entries:

class ElegantGroovyFeature { static Map asType(Object o, Class m) { if (m == Map) { o.metaClass.properties .findAll { it.getSetter() != null } .collectEntries { prop -> [prop.name, prop.getProperty(o)] } } else { o.asType(m) } } } 

拡張クラスはobj as Map式を使用してマップに任意のオブジェクトを変換するためにあなたを可能にする、asオペレータに対応asTypeメソッドをオーバーライドします(obj)); ' - それはGroovyのコードのようには見えません。 Javascriptのように見える。 –

0

これは、基本的には、@ジェフ・スコット・ブラウンの答えの変種である

関連する問題