2017-11-13 5 views
1

Swagger定義からクラスを生成しました。 1つのフィールドが共通のopの4つの異なるクラスがあります(クラス階層はなく、各クラスにフィールドが複製されています)。JSONデータのストリームをオブジェクトに読み込むために生成されたクラスとJacksonを操作する

opフィールドの値に応じて、JSONデータのストリームを4つの異なるクラスのいずれかに逆シリアル化する必要があります。例えば

{"op": "typeA", ...} -> generates TypeA 
{"op": "typeB", ...} -> generates TypeB 

が、私はこのためにジャクソンを使用したいです。私が見つけたすべての例では、問題を解決するためにクラス階層を作ることができるように元のクラスを修正できると仮定しているという問題があります。しかし、私の質問は、どのように私は元のクラスを変更することなくこれを解決することができますか?

元の例は、階層を想定し、このように行われる:

@JsonTypeInfo(
     use = JsonTypeInfo.Id.NAME, 
     include = JsonTypeInfo.As.PROPERTY, 
     property = "op", 
     visible = true) 
@JsonSubTypes({ 
     @JsonSubTypes.Type(value = ConnectionMessage.class, name = "connection"), 
     @JsonSubTypes.Type(value = StatusMessage.class, name = "status"), 
     @JsonSubTypes.Type(value = MarketChangeMessage.class, name = "mcm"), 
     @JsonSubTypes.Type(value = OrderChangeMessage.class, name = "ocm"), 
}) 
public interface MixInResponseMessage { 

} 
+0

これは階層を前提としているので、完全に答えはありませんが、ミックスインを使って考えても構いません。ここでは、ミックスインを使用して親の抽象クラスをターゲットにする例を示します。 https://github.com/Flaw101/springbootmixin –

答えて

1

これはスイッチとカスタム・デシリアライザを用いて行うことができる - 「OP」の値に応じて正しいタイプを解析する場合文フィールド:ObjectMapperフィールドが必要なタイプのオブジェクトにTreeNodeを変換するために使用される方法

class OpDeserializer extends JsonDeserializer { 
    private final ObjectMapper mapper = new ObjectMapper(); 

    @Override 
    public Object deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { 
     final JsonNode node = jsonParser.readValueAsTree(); 
     final String op = node.get("op").asText(); 
     switch (op) { 
      case "typeA": return mapper.treeToValue(node, TypeA.class); 
      case "typeB": return mapper.treeToValue(node, TypeB.class); 
      default: return mapper.treeToValue(node, Object.class); 
     } 
    } 
} 

注意。

TypeATypeBなどは、Object以外の共通の親を持つ必要はありません。

"op"フィールドを持つ各JSON要素に使用されているように、このデシリアライザを指定する必要があります。私はこのクラスを解析してテストしました:

class Ops { 
    @JsonDeserialize(contentUsing = OpDeserializer.class) 
    Object[] ops; 
} 
関連する問題