2017-07-10 51 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