2011-01-19 9 views
5

Playフレームワークでは、他のモデルへのオブジェクト参照であるフィールドを持つモデルがいくつかあります。私はrenderJSONを使用するとき、私はそれらのオブジェクト参照が含まれることを望んでいません。現在のところ私のニーズに合わせて、必要なフィールドを含む別々のビューモデルクラスを作成し、コントローラではこのビュークラスのインスタンスを必要に応じて作成します。理想的には、ビュークラスを作成することなく、モデルクラス自体を使用できるようにしたいと考えています。特定のフィールドがシリアル化されないようにします。

フィールドに注釈を付けてrenderJSONを使用してシリアル化されないようにする方法はありますか?

答えて

12

プレイはそのJSONシリアライズのためのGsonを使用するため、次のことを試すことができます。

public static void test() 
{ 
    Object foo = new SomeObject("testData"); 
    Gson gson = new GsonBuilder() 
     .excludeFieldsWithModifiers(Modifier.TRANSIENT) 
     .create(); 
    renderJSON(gson.toJson(foo)); 
} 

今一時的なものとしてマークされ、各フィールドがシリアライズされることはありません。別の(より良い)方法もあります。 com.google.gson.annotations.Exposeアノテーションを使用して、シリアル化する各フィールドにマークを付けることができます。遊びと

FlexJSONを使用して
public static void test() 
{ 
    Object foo = new SomeObject("testData"); 
    Gson gson = new GsonBuilder() 
     .excludeFieldsWithoutExposeAnnotation() 
     .create(); 
    renderJSON(gson.toJson(foo)); 
} 
+0

感謝を見ることができます!簡単な質問ですが、どうして@Exposeを使う方が良いのですか? –

+0

@Matias Elorriaga私は個人的には明示的なアプローチがより好きです:)私は頻繁に、私は誤ってフィールドを公開することがあります。 –

-1

フィールド名を直列化除外のメンバ配列と照合するために、renderJSONをオーバーライドします。

0

ない私がここでそれを行いますので、誰もがこの回答への最も直接的な解決策を書かなかった理由を確認してください。

Gson経由で直列化したくないフィールドをtransientとマークするだけです。ここで

は例です:過渡マークされている項目の

public class Animal 
{ 
     private String name = "dog"; 
     transient private int port = 80; 
     private String species = "canine"; 
     transient private String password = "NoOneShouldSeeThis"; 
} 

いずれもシリアライズされません。 デシリアライズすると、デフォルト(クラスデフォルト)の値に設定されます。

JSONは以下のようになります。結果として得られる:

{"name":"dog","species":"canine"} 

一過性の詳細については、あなたがSO Why does Java have transient fields?

関連する問題