2014-01-21 10 views
5

私はdef json = object as JSONを使って変換しているgrailsオブジェクトを持っています。変換後、pinというプロパティをJSONに1つ追加します。これは次のようになります。grailsドメインオブジェクトをJSONに変換して操作する

[location:[lat:23.03, lon:72.58]] 

  1. 次の文字列を使用してJSONBojectを作成し、文字列
  2. にJSONに変換grails.converters.json
  3. を使用してJSONにDomainClassをシリアルのようにこれを行うには、これまでと思われる唯一の方法ステップ2から
  4. プロパティを追加します。
  5. 文字列に戻します。

grails.converters.jsonを使用してこれを行う方法は他にありますか?私はGsonを使用して試してみましたが、私は

答えて

1

これを試してみて、私は多くの循環参照エラーを取得していますので、そのルートを行くにしたくない:私は最近、同様のことを行うために必要な

domainInstance.properties + [pin: pinInstance] as JSON 
+0

このピンをドメインインスタンスの一部として追加しますか? – Sap

+0

いいえ、そうではありません。しかし、本当にあなたのドメインを追加のフィールドにマージする必要がありますか?もしそうなら、あなたのドメインクラスにこのフィールドを追加するほうがいいでしょうか?あるいは、その中に代理フィールドを作り、 'pin'のゲッターを提供しますか? –

+0

これは私の最初の試みでしたが、ドメインクラスでlatとlonを追加し、 'public getPin(){ \t \t [location:{lat:lat、lon:lon]] \t}メソッドを作成しましたが、 JSONのピンとしてのオブジェクトはJSONの文字列表現ではありません – Sap

0

。いくつかの注意点が:

  • これは
  • のGrails 2.4.5を使用している私は、バックエンドとしてのMongoDBを使用しています。このように、MongoDBドメインクラスのオブジェクトマーシャラーを作成しました。それは、以下に印刷され、そして、あなたのドメインクラスに対して同様のマーシャラーをラップすることができます(複数可):

マーシャラー:

class MongodbObjectMarshaller implements ObjectMarshaller<JSON> { 
    @Override 
    boolean supports(Object o) { return o?.properties?.dbo } 

    @Override 
    void marshalObject(Object obj, JSON converter) throws  
    ConverterException { 

     Map propertiesToOutput = obj.properties.dbo 

     propertiesToOutput.remove("_id") //don't print org.bson.types.ObjectId 
     propertiesToOutput.remove("version") //don't print gorm verson column 

     converter.build { 
      _id obj.id.toString() 
      propertiesToOutput.each{ entry -> 
       "$entry.key" entry.value 
      } 
     } 

    } 
} 

そのマーシャラーは、それはJSON出力にドメインクラスのいずれかを許可しない何プロパティ。 obj.properties.dboはMongoDBにとって特別ですが、通常のドメインクラスでは、プロパティを取得して不要なものを除外できます。

はその後、私のコントローラでは、これは動作します:

domainInstance.pin = [location:[lat:23.03, lon:72.58]] 
def content = tacticalCard as JSON 

私のマーシャラーが今ピンプロパティをピックアップし、それを印刷しているため。

関連する問題