Gsonチュートリアル10:Exclusion Strategies

4745 ワード

この記事はGson Tutorial Seriesシリーズのチュートリアルから翻訳されています.この記事では、Gsonの除外ポリシー(Exclusion Strategies)をカスタマイズする方法について説明します.
以前に発表されたブログでは、いくつかの属性がシーケンス化されるかどうかと逆シーケンス化されるかどうかを制御する技術を学びました.これまではプロパティレベルでした.シーケンス化と逆シーケンス化の要素を同じ時間に変更できます.このブログでは、より多くの一般的なルールを設定する方法を検討して、値属性の変換を空にします.

transientや@Exposeよりも強力な排除策


transientと@Exposeを学習しました.シーケンス化と逆シーケンス化の各プロパティを変更できます.次に、より一般的な方法を検討します.GsonはExclusionStrategiesと呼ばれています.もちろん、GsonBuilderで設定する必要があります.
特定の実装を開始する前に、テストモデルを作成します.いくつかの属性を持つ新しいUserDateモデルを使用します.
public class UserDate {  
    private String _name;
    private String email;
    private boolean isDeveloper;
    private int age;
    private Date registerDate = new Date();
}

プロパティのタイプと名前に注意してください.これは非常に重要です.Dateおよびbooleanのすべてのタイプの属性を除外する必要があると仮定すると、ExclusionStrategiesを使用すると簡単です.GsonBuilderで実現できます.
GsonBuilder gsonBuilder = new GsonBuilder();  
gsonBuilder.setExclusionStrategies(new ExclusionStrategy() {  
    @Override
    public boolean shouldSkipField(FieldAttributes f) {
        return false;
    }

    @Override
    public boolean shouldSkipClass(Class> incomingClass) {
        return incomingClass == Date.class || incomingClass == boolean.class;
    }
});
Gson gson = gsonBuilder.create();

UserDate user = new UserDate("Norman", "[email protected]", 26, true);  
String usersJson = gson.toJson(user); 

ExclusionStrategiesクラスには、2つの書き換え方法があります.上記の例では、2つ目の方法を使用しました.クラスがDateまたはbooleanの1つであるかどうかを確認します.属性がいずれかのタイプである場合、メソッドはtrueを返し、Gsonは属性を無視します.この方法で任意のクラスをチェックすることができます.JSON結果には文字列型と整数型のみが含まれます.
{
  "age": 26,
  "email": "[email protected]",
  "_name": "Norman"
}

別のメソッドの除外機能は、プロパティの宣言に基づいています.たとえば、下線を含むすべての下線を除外したい場合はを選択します.
GsonBuilder gsonBuilder = new GsonBuilder();  
gsonBuilder.setExclusionStrategies(new ExclusionStrategy() {  
    @Override
    public boolean shouldSkipField(FieldAttributes f) {
        return f.getName().contains("_");
    }

    @Override
    public boolean shouldSkipClass(Class> incomingClass) {
        return incomingClass == Date.class || incomingClass == boolean.class;
    }
});
Gson gson = gsonBuilder.create();

UserDate user = new UserDate("Norman", "[email protected]", 26, true);  
String usersJson = gson.toJson(user);  

JSONの結果はもっと短くなりました.
{
  "age": 26,
  "email": "[email protected]"
}

さまざまなシーンで排除策を運用することができます.特殊なシーケンス化と逆シーケンス化を排除する一般的なメカニズムを持っている場合は、非常に簡単です.マルチクロック除外ポリシーをパラメータに渡すことができることに注意してください.
もしあなたが今でも排除戦略の重要な点が見えないなら、それは大丈夫です.より複雑なタイプに伴い、私たちの内容はさらに深くなります.カスタムアダプタを書き始めると、確定値が表示されます.幸いなことに、戦略を排除することでGsonはどんなタイプを無視することができます.

除外ポリシーは、シーケンス化または逆シーケンス化にのみ適用されます。


以前の紙面では,シーケンス化と逆シーケンス化の両方に対して排除戦略を申請した.どちらかに適用する必要がある場合は、次の方法を使用します.
  • addSerializationExclusionStrategy()
  • addDeserializationExclusionStrategy().

  • 両者の効果は、以前のsetExclusionStrategies()と同じです.ExclusionStrategyオブジェクトを渡すこともできます.

    修飾語ベースのメンバー変数の除外


    前に説明したように、transient修飾を使用するすべてのメンバー変数は、シーケンス化および逆シーケンス化の過程で無視されます.
    GsonBuilderはあなたがこの行為を変えることを許可します.excludeFieldsWithModifiers()を使用して、特定の修飾語によって修飾されたメンバー変数をシーケンス化および逆シーケンス化中に除外できます.この方法はjavaを渡す必要がある.lang.reflect.Modifierクラスの修飾語.
    たとえば、次のモデルがあります.
    public class UserModifier {  
        private String name;
        private transient String email;
        private static boolean isDeveloper;
        private final int age;
    }
    

    すべてのfinalタイプとstaticタイプを除外したいがfieldを含む場合は、次のコードでGsonを構成する必要があります.
    GsonBuilder gsonBuilder = new GsonBuilder();  
    gsonBuilder.excludeFieldsWithModifiers(Modifier.STATIC, Modifier.FINAL);  
    Gson gson = gsonBuilder.create();
    
    UserModifier user = new UserModifier("Norman", "[email protected]", 26, true);  
    String usersJson = gson.toJson(user);
    

    上のコードは次のJSONを作成します.
    {
      "email": "[email protected]",
      "name": "Norman"
    }
    

    Gsonインスタンスにはtransientに設定されている場合でも、emailドメインが含まれます.excludeFieldsWithModifiers()メソッドを呼び出してデフォルト設定を書き換えます.私たちはstaticとfinalだけを伝えたので、transient修飾語は無視されません.修飾語に関係なくすべてのドメインを含める場合は、excludeFieldsWithModifiers()に空のリストパラメータを渡すだけです.

    @Exposeで注記されていないドメインを除外


    最後に、私たちはあまり興味がありませんが、すべてのオプションを提示します:e x c l u d e F ieldsWithoutExposeAnnotation.名前が示すように、@Exposeで注記されていないメンバー変数はすべて除外されます.
    アプリケーションモデルを@Exposeで注記する必要があるように強制することで、開発者がシーケンス化と逆シーケンス化が必要なドメインを考えることができます.

    展望


    このブログでは、より一般的なレベルで属性を排除することを学びました.ExclusionStrategiesでは、属性を除外する2つの選択肢が用意されています.クラスタイプと属性名でフィルタできます.さらに専門的な排除戦略があります.
    次のブログでは、JSONの構造が基準に従わなければ、Gsonがどれだけ柔軟になるかを探ります.