2017-03-15 17 views
1

私はComponentsSetを持っている:Jacksonのシリアル化から1つのコレクション要素を除外する方法は?

final class User{ 

    private final Set<Component> COMPONENTS; 

    public User(String userID) 
    { 
     this.userID = userID; 
     COMPONENTS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
        new AuthorizationComponent(this.getUserID()) 
        new ProfileComponent(this.getUserID()), 
        new ThemeComponent(this.getUserID())) 
      )); 
    } 
} 

各コンポーネント:認証、プロファイル、テーマはComponentのサブクラスです。

は今、私はUserを作成し、JSON文字列に変換します

ObjectMapper mapper = new ObjectMapper(); 
String json = mapper.writeValueAsString(user); 

私はこのStringからAuthorizationComponentを除外する必要があります。 transient修飾子と注釈を使用することができますが、これはフィールドでのみ機能し、コレクション要素を1つだけ削除する必要があります。

これは可能ですか?

+0

は、このリンクはあなたのために参考になりましたか? https://github.com/FasterXML/jackson-annotations/issues/25 – utkusonmez

答えて

0

いいえ、これは可能ではないと思います。独自のカスタムシリアライザを作成することもできます(Jackson How-To: Custom Serializers参照)。たとえば、シリアライザをSetにカスタマイズし、「悪い」クラスを除外することができます。しかし、ソリューションを理解するためには、Jacksonの内部について多くの知識を必要とするため、このコードを後で維持することについては、特に努力する価値があるとは思いません。

その他のオプション:

  • 代わりSetで単一のフィールドを持つ、別々のフィールドを使用します。クラスUser内のフィールドを分割するか、コンテナオブジェクト(ConfigComponentsなど)を作成します。コンテナオブジェクトには、コンポーネントごとにフィールドがあります。私の経験上、普通のSetまたはListを使って異なるクラスのインスタンスを格納するのは良い解決策ではありません。
  • AuthorizationComponentを完全に除外する代わりに、問題を引き起こすクラスのフィールドのみを除外します。それが問題の側面にある。

あなたのケースで最も適切なものは、プロジェクトによって異なります。また、どのようにクラスを使用するかによって異なります。

0

は、Userのカスタムシリアライザを定義できます。

出典:カスタムシリアライザのJackson – Custom Serializer

例:

public class ItemSerializer extends StdSerializer<Item> { 

    public ItemSerializer() { 
     this(null); 
    } 

    public ItemSerializer(Class<Item> t) { 
     super(t); 
    } 

    @Override 
    public void serialize(
     Item value, JsonGenerator jgen, SerializerProvider provider) 
     throws IOException, JsonProcessingException { 

     jgen.writeStartObject(); 
     jgen.writeNumberField("id", value.id); 
     jgen.writeStringField("itemName", value.itemName); 
     jgen.writeNumberField("owner", value.owner.id); 
     jgen.writeEndObject(); 
    } 
} 
関連する問題