2017-07-10 82 views
1

說我有一些JSON像這樣傑克遜@JsonTypeInfo屬性特性假定字符串值

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

是否可以使用傑克遜使用類型值屬性來告訴傑克遜的對象是什麼態類型?舉例來說,我已經試過沿此線的東西沒有任何的運氣

@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

使用嵌套在另一個對象JSON辨別類型String似乎沒有傑克遜的支持。你總是可以使用自定義的Deserializer來處理這類事情。它看起來是這樣的:

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(using = ADeserializer.class) 
abstract class A { 

和派生類空@JsonDeserialize避免再次調用相同的自定義解串器(StackOverflowError) 。

@JsonDeserialize 
class B extends A { 

無需@JsonTypeName@JsonTypeInfo@JsonSubTypes的上方。

我看了一些其他選項,如自定義JsonTypeIdResolverthis answer,它們延伸AsPropertyTypeDeserializer,但無法讓你的任何一個在你的情況下工作。

+0

我認爲它可能歸結爲類似的東西!謝謝! – PDStat