Gsonチュートリアル10:Exclusion Strategies
4745 ワード
この記事はGson Tutorial Seriesシリーズのチュートリアルから翻訳されています.この記事では、Gsonの除外ポリシー(Exclusion Strategies)をカスタマイズする方法について説明します.
以前に発表されたブログでは、いくつかの属性がシーケンス化されるかどうかと逆シーケンス化されるかどうかを制御する技術を学びました.これまではプロパティレベルでした.シーケンス化と逆シーケンス化の要素を同じ時間に変更できます.このブログでは、より多くの一般的なルールを設定する方法を検討して、値属性の変換を空にします.
transientと@Exposeを学習しました.シーケンス化と逆シーケンス化の各プロパティを変更できます.次に、より一般的な方法を検討します.GsonはExclusionStrategiesと呼ばれています.もちろん、GsonBuilderで設定する必要があります.
特定の実装を開始する前に、テストモデルを作成します.いくつかの属性を持つ新しいUserDateモデルを使用します.
プロパティのタイプと名前に注意してください.これは非常に重要です.Dateおよびbooleanのすべてのタイプの属性を除外する必要があると仮定すると、ExclusionStrategiesを使用すると簡単です.GsonBuilderで実現できます.
ExclusionStrategiesクラスには、2つの書き換え方法があります.上記の例では、2つ目の方法を使用しました.クラスがDateまたはbooleanの1つであるかどうかを確認します.属性がいずれかのタイプである場合、メソッドはtrueを返し、Gsonは属性を無視します.この方法で任意のクラスをチェックすることができます.JSON結果には文字列型と整数型のみが含まれます.
別のメソッドの除外機能は、プロパティの宣言に基づいています.たとえば、下線を含むすべての下線を除外したい場合はを選択します.
JSONの結果はもっと短くなりました.
さまざまなシーンで排除策を運用することができます.特殊なシーケンス化と逆シーケンス化を排除する一般的なメカニズムを持っている場合は、非常に簡単です.マルチクロック除外ポリシーをパラメータに渡すことができることに注意してください.
もしあなたが今でも排除戦略の重要な点が見えないなら、それは大丈夫です.より複雑なタイプに伴い、私たちの内容はさらに深くなります.カスタムアダプタを書き始めると、確定値が表示されます.幸いなことに、戦略を排除することでGsonはどんなタイプを無視することができます.
以前の紙面では,シーケンス化と逆シーケンス化の両方に対して排除戦略を申請した.どちらかに適用する必要がある場合は、次の方法を使用します. addSerializationExclusionStrategy() addDeserializationExclusionStrategy().
両者の効果は、以前のsetExclusionStrategies()と同じです.ExclusionStrategyオブジェクトを渡すこともできます.
前に説明したように、transient修飾を使用するすべてのメンバー変数は、シーケンス化および逆シーケンス化の過程で無視されます.
GsonBuilderはあなたがこの行為を変えることを許可します.excludeFieldsWithModifiers()を使用して、特定の修飾語によって修飾されたメンバー変数をシーケンス化および逆シーケンス化中に除外できます.この方法はjavaを渡す必要がある.lang.reflect.Modifierクラスの修飾語.
たとえば、次のモデルがあります.
すべてのfinalタイプとstaticタイプを除外したいがfieldを含む場合は、次のコードでGsonを構成する必要があります.
上のコードは次のJSONを作成します.
Gsonインスタンスにはtransientに設定されている場合でも、emailドメインが含まれます.excludeFieldsWithModifiers()メソッドを呼び出してデフォルト設定を書き換えます.私たちはstaticとfinalだけを伝えたので、transient修飾語は無視されません.修飾語に関係なくすべてのドメインを含める場合は、excludeFieldsWithModifiers()に空のリストパラメータを渡すだけです.
最後に、私たちはあまり興味がありませんが、すべてのオプションを提示します:e x c l u d e F ieldsWithoutExposeAnnotation.名前が示すように、@Exposeで注記されていないメンバー変数はすべて除外されます.
アプリケーションモデルを@Exposeで注記する必要があるように強制することで、開発者がシーケンス化と逆シーケンス化が必要なドメインを考えることができます.
このブログでは、より一般的なレベルで属性を排除することを学びました.ExclusionStrategiesでは、属性を除外する2つの選択肢が用意されています.クラスタイプと属性名でフィルタできます.さらに専門的な排除戦略があります.
次のブログでは、JSONの構造が基準に従わなければ、Gsonがどれだけ柔軟になるかを探ります.
以前に発表されたブログでは、いくつかの属性がシーケンス化されるかどうかと逆シーケンス化されるかどうかを制御する技術を学びました.これまではプロパティレベルでした.シーケンス化と逆シーケンス化の要素を同じ時間に変更できます.このブログでは、より多くの一般的なルールを設定する方法を検討して、値属性の変換を空にします.
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はどんなタイプを無視することができます.
除外ポリシーは、シーケンス化または逆シーケンス化にのみ適用されます。
以前の紙面では,シーケンス化と逆シーケンス化の両方に対して排除戦略を申請した.どちらかに適用する必要がある場合は、次の方法を使用します.
両者の効果は、以前の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がどれだけ柔軟になるかを探ります.