2017-07-10 5 views
1

が、私はそれは、オブジェクトがある多型どのタイプジャクソンに伝えるための型値プロパティを使用するためにジャクソンを使用することが可能ですので、ジャクソン@JsonTypeInfoプロパティ属性は

[ 
    { 
     'type' : { 
      'value': 'B' 
     } 
    }, 
    { 
     'type' : { 
      'value': 'C' 
     } 
    } 
] 

のようないくつかのJSONを持っていると言う文字列値を想定して?例えば、私は種類を識別するためにJSONで別のオブジェクトにネストStringはジャクソンでサポートされていないよう使用して、任意の運

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.Property, property = "type") 
@JsonSubTypes({ 
    @JsonSubTypes.Type(name = "B", value = B.class), 
    @JsonSubTypes.Type(name = "C", value = C.class) 
       } 
) 
abstract class A { 
    private Type type; 
} 

@JsonTypeName(value = "B") 
class B extends A { 
} 

@JsonTypeName(value = "C") 
class C extends A { 
} 

class Type { 
    private String value; 
} 
+0

JSON構造体、クラス構造体、またはその両方を変更できますか? –

+0

JSONは同じままにしなければならないが、クラス構造は変更できる。 – PDStat

答えて

1

せずにこの線に沿って何かをしようとしました。あなたはいつもそのようなもののためにカスタムデシリアライザを使うことができます。 (StackOverflowError)を再び同じカスタムデシリアライザの呼び出しを避けるために、空の@JsonDeserialize

@JsonDeserialize(using = ADeserializer.class) 
abstract class A { 

と派生クラス:

class ADeserializer extends JsonDeserializer<A> { 
    @Override public A deserialize(JsonParser p, DeserializationContext ctx) throws IOException { 
     ObjectMapper mapper = (ObjectMapper) p.getCodec(); 
     ObjectNode node = mapper.readTree(p); 
     String value = node.get("type").get("value").asText(); 
     switch (value) { 
      case "B": return mapper.treeToValue(node, B.class); 
      case "C": return mapper.treeToValue(node, C.class); 
      default: return null; 
     } 
    } 
} 

、それはデシリアライザを指定するには、抽象クラスに注釈を使用する:それは次のようになります。 。

@JsonDeserialize 
class B extends A { 

@JsonTypeName@JsonTypeInfoおよび上記のため@JsonSubTypesの必要はありません。

カスタムとthis answerのような他のオプションをいくつか見てきましたが、これはAsPropertyTypeDeserializerに拡張されていますが、いずれのケースでも動作しない可能性があります。

+0

私はそれが何かのようになるかもしれないと思った!ありがとうございました! – PDStat

関連する問題