【问题标题】:Json custom deserializer stuck in infinite recursionJson自定义反序列化器陷入无限递归
【发布时间】:2016-12-01 17:43:36
【问题描述】:

实现了一个自定义反序列化器,通过以下方式反序列化 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);
}

执行完mapper.treeToValue后,控制又回到myResourcedeserialize方法,无限次执行,导致stackOverFlowError。

有什么建议吗?

【问题讨论】:

    标签: java json jackson deserialization


    【解决方案1】:

    我们也遇到过类似的情况,这个解决方案基于: 自定义反序列化器用于多态解析 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{
    ......
    }
    

    参考:http://www.robinhowlett.com/blog/2015/03/19/custom-jackson-polymorphic-deserialization-without-type-metadata/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 2019-10-19
      • 1970-01-01
      • 2015-02-17
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多