杰克逊解串器将两种类型作为一种处理

时间:2016-05-16 14:17:03

标签: java android json jackson deserialization

我的服务器返回结果有两种不同的类型:成功时的SearchResultDTO和错误时的String。我需要处理这两种类型,并始终返回SearchResultDTO类型。这是我的解串器:

public class SearchResultsDeserializer extends JsonDeserializer<SearchResultDTO> {

    @Override
    public SearchResultDTO deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
        JsonToken t = jp.getCurrentToken();
        if (t == JsonToken.VALUE_STRING){
            return new SearchResultDTO(jp.getText());
        } else {
            return jp.readValueAs(SearchResultDTO.class);
        }
    }
}

当我运行此代码并且服务器发送SearchResultDTO对象时,jackson通过调用此函数进入无限循环并返回错误:“java.lang.StackOverflowError:stack size 1036KB”

1 个答案:

答案 0 :(得分:0)

轻松修复将在SearchResultsDeserializer中创建ObjectMapper的新实例,并使用它代替JsonParser

public static class SearchResultsDeserializer extends JsonDeserializer<SearchResultDTO> {
    private static ObjectMapper mapper = new ObjectMapper();
    @Override
    public SearchResultDTO deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
        JsonToken t = jp.getCurrentToken();
        if (t == JsonToken.VALUE_STRING){
            return new SearchResultDTO(jp.getText());
        } else {
            return mapper.readValue(jp, SearchResultDTO.class);
        }
    }
}

困难的方法是在自定义反序列化器中保存默认的反序列化器。 以下是更多信息:How do I call the default deserializer from a custom deserializer in Jackson