2016-07-08 4 views
0

ジャクソン& JSONをデシリアライズするのが初めてです。 I "メートルメッセージプロセッサを作成し、次のようなものを持ってしようとしている:ジャクソンJSONの使用w /ネストされたクラスでデシリアライズしますか?

@JsonDeserialize(builder = TestMessage.TestMessageBuilder.class) 
private static class TestMessage { 
    @Nonnull 
    private Long timestamp; 
    @Nonnull 
    private String regionId; 
    @Nonnull 
    private String userId; 
    @Nonnull 
    private String action; 
    @Nonnull 
    private TestMessageMetadata metadata; 

    @JsonPOJOBuilder(withPrefix = "") 
    public static class TestMessageBuilder {} 
} 

問題は、メッセージがでてくるアクションタイプの種類に応じて、TestMessageMetadataのいずれかが必要になりますということですたとえば、actionが "stream"の場合、TestMessageMetadataはTestMessageStreamMetadataタイプである必要があります。TestMessageMetadataの各サブクラスには異なる属性があります(TestMessageStreamMetadataには "stream"タイプのみに適用される4つのフィールドがあります)。他のアクションでは、そのタイプのアクションだけに適用されるフィールドが1つしかないかもしれません)

プロセッサは、この1つのメッセージングクラス全体を持つ必要があります。したがって、複数のアクションタイプを処理するにはどうすればよいですか?ヘルプは非常に高く評価されるだろう!

答えて

1

問題は、アクションタイプの種類に応じて、メッセージ がでてくるということです、TestMessageMetadataは 、いくつかの異なるサブクラスのセットの1つである必要があります。

あなたは@JsonTypeInfoを探しているようです。 @JsonTypeInfoは、多型を扱うために使用されます。実際のタイプのプロパティ値が複数のサブタイプの1つであるケースを設定します。続き

は一例です:

class TestMessage { 

    private String action; 

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_POPERTY, propery = "action") 
    @JsonSubTypes({ 
     @JsonSubTypes.Type(value = TestMessageStreamMetadata.class, name = "stream"), 
     @JsonSubTypes.Type(value = TestMessageFooMetadata.class, name = "foo") 
    }) 
    private TestMessageMetadata metadata; 

} 
関連する問題