Ven*_*nky 5 java json jackson deserialization
通过以下方式实现了自定义反序列化器以反序列化JSON。但是mapper.treeToValue导致无限次调用代码。
public class MyDeserializer extends StdDeserializer<MyResource> {
@Override
public myResourcedeserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
MyResource resource = null;
Class<? extends MyResource > clazz = null;
ObjectMapper mapper = (ObjectMapper) parser.getCodec();
ObjectNode node = (ObjectNode) mapper.readTree(parser);
Iterator<Map.Entry<String, JsonNode>> elementsIterator = node.fields();
while (elementsIterator.hasNext()) {
Map.Entry<String, JsonNode> element = elementsIterator.next();
if(element.getKey().equals("typeId"))
{
if(element.getValue().asInt() == 1)
{
clazz = SpecificResource.class;
break;
}
}
}
return mapper.treeToValue(node,clazz);
}
Run Code Online (Sandbox Code Playgroud)
执行mapper.treeToValue之后,控件再次返回myResourcedeserialize方法,并无限执行该方法,并导致stackOverFlowError。
有什么建议吗?
我们已经遇到过类似的情况,并且此解决方案基于以下解决方案:自定义反序列化器用于多态解析JSON,而无需使用type属性
让我们将多态类称为BaseResource(基类),SubResource1,SubResource2。
BaseResource具有注释以指定哪个CustomSerializer类
@JsonDeserialze(using=CustomDeserializer.class)
public class BaseResource{
......
}
Run Code Online (Sandbox Code Playgroud)
因此,在SubResource1和SubResource2上,我们通过使用JsonDeserialer.None.class添加注释以不使用CustomDeserialzer.class。
@JsonDeserialze(using=JsonDeserialer.None.class)
public class SubResource1 extends BaseResource{
......
}
Run Code Online (Sandbox Code Playgroud)
参考:http : //www.robinhowlett.com/blog/2015/03/19/custom-jackson-polymorphic-deserialization-without-type-metadata/
| 归档时间: |
|
| 查看次数: |
662 次 |
| 最近记录: |