Jackson JSON对象映射器反序列化为LinkedHashMap而不是HashMap。

8
我有一个包含内部 map 的 POJO。我想要将其从 JSON 反序列化为 HashMap,但是 Jackson 将 JSON 中的内部 map 反序列化为 LinkedHashMap。我可以通过将 Map 的类型从“Map”更改为“HashMap”来强制使用 HashMap,但我想知道是否有一种方法告诉 Jackson 反序列化为特定的 Map 实现?
以下是 JSON:
{
    "transforms": {
        "variable_name1": [{
            "min": 100,
            "max": 200,
            "value": 0.6
        }],
        "variable_name2": [{
            "min": 100,
            "max": 200,
            "value": 0.6
        }],
        "variable_name3": [{
            "min": 100,
            "max": 200,
            "value": 0.6
        }]
    }
}

以及 Transforms 类:

public class Transformer {
    Map<String, List<Transform>> transforms;

    public Transformer() {
        transforms = new HashMap<String, List<Transform>>();
    }

    public void setTransforms(Map<String, List<Transform>> transforms) {
        this.transforms = transforms;
    }
}

我是如何使用ObjectMapper的:

try(Reader reader = new InputStreamReader(TransformTester.class.getResourceAsStream("transforms.json"), "UTF-8")) {
            ObjectMapper objMapper = new ObjectMapper();
            Transformer tr = objMapper.readValue(reader, Transformer.class);
}

3
Jackson正在使用LinkedHashMap来保持JSON字段的顺序。这样做有什么问题吗? - Andreas
@Andreas LinkedHashMap 会不会有额外的开销?我不在意顺序。 - Seephor
@SotiriosDelimanolis,LinkedHashMap 会不会因为需要维护顺序而变得更慢、开销更大?我并不关心顺序。 - Seephor
2
你已经对你的应用程序进行了基准测试,并确定这是一个问题? - Sotirios Delimanolis
1
@Seephor 那就是“过早优化”,在你真正遇到问题之前,不应该浪费时间在这上面。 - Andreas
显示剩余2条评论
1个回答

3
如果您需要其他类型,您可以实现Jackson转换器并对其进行注释。
public static class TransformConverter implements Converter<Map<String,List>,Map<String,List>>{

    @Override
    public Map<String,List> convert(Map<String,List> map) {
        return new HashMap<>(map);
    }

    @Override
    public JavaType getInputType(TypeFactory typeFactory) {
        return typeFactory.constructMapType(Map.class, String.class, List.class);
    }

    @Override
    public JavaType getOutputType(TypeFactory typeFactory) {
        return typeFactory.constructMapType(Map.class, String.class, List.class);
    }
}



public static class Transformer {
    @JsonDeserialize(converter = TransformConverter.class)
    Map<String, List<Transform>> transforms;
//rest of your class
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接