Java反序列化json内存溢出_java – Json自定义反序列化器卡在无限递归中

通过以下方式实现自定义反序列化器以反序列化JSON.但mapper.treeToValue导致无限次调用代码.

public class MyDeserializer extends StdDeserializer {

@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> elementsIterator = node.fields();

while (elementsIterator.hasNext()) {

Map.Entry element = elementsIterator.next();

if(element.getKey().equals("typeId"))

{

if(element.getValue().asInt() == 1)

{

clazz = SpecificResource.class;

break;

}

}

}

return mapper.treeToValue(node,clazz);

}

执行mapper.treeToValue后,控制再次返回myResourcedeserialize方法并执行无限次数并导致stackOverFlowError.

有什么建议吗?

解决方法:

我们遇到过类似的情况,这个解决方案基于:

自定义反序列化器用于在不使用type属性的情况下以多态方式解析JSON

让我们将多态类称为BaseResource(基类),SubResource1,SubResource2.

BaseResource具有注释以指定哪个CustomSerializer类

@JsonDeserialze(using=CustomDeserializer.class)

public class BaseResource{

......

}

所以在SubResource1和SubResource2上,我们通过使用JsonDeserialer.None.class添加注释以不使用CustomDeserialzer.class

@JsonDeserialze(using=JsonDeserialer.None.class)

public class SubResource1 extends BaseResource{

......

}

标签:java,json,jackson,deserialization

来源: https://codeday.me/bug/20190828/1754925.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值