jackson将字符串反序列化为参数化映射

时间:2017-12-04 13:43:18

标签: java jackson

我在以下结构中有一个json字符串:

{   
    "1": { ... },
    "2": { ... },
    "3": { ... }
}

其中1,2和3是标识符。

我想反序列化此字符串并将其强制转换为以下类型 - Map<Integer, List<MyCustomPojo>>

问题在于每个值{ ... }都有自己的结构,但是我需要将它们全部解析并转换为一个公共结构 - MyCustomPojo

我可以通过实现自定义反序列化器来实现:

public class CustomMapDeserializer extends JsonDeserializer<Map<Integer, List<MyCustomPojo>>> {

    @Override
    public Map<Integer, List<MyCustomPojo>> deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException {
        JsonNode root = jsonParser.getCodec().readTree(jsonParser);

    // parse JsonNode and return  Map<Integer, List<MyCustomPojo>>      
}

现在我需要将这个反序列化器添加到模块中,然后用对象映射器注册它。

SimpleModule module = new SimpleModule();
module.addDeserializer(Map.class, new CustomMapDeserializer()); // can’t specify type for map
objectMapper.registerModule(module);

问题是现在它将应用于我的应用程序中的所有Map类。我希望它仅适用于参数化地图 - Map<Integer, List<MyCustomPojo>>.

有可能吗?

2 个答案:

答案 0 :(得分:1)

最简单的解决方案应该是创建一个继承自Map的新类,并在添加反序列化器时使用它

答案 1 :(得分:0)

您正在考虑的方式不起作用,可能需要重写一些代码才能仅应用于参数化地图。我不想提供任何虚假信息,抱歉我无法提供解决方案,但我希望此评论能够帮助其他人为其他有能力的编码人员提供解决方案。