【发布时间】:2016-04-30 19:27:00
【问题描述】:
我正在尝试理解 Jackson 的 convertValue 方法。最初我认为它在某种程度上等同于 Gson#fromJson 方法,但似乎并非如此。
问题来了:
// Map<String, Object> map = ...
ObjectMapper mapper = new ObjectMapper();
MyPojo pojo = mapper.convertValue(map.get(key), MyPojo.class);
for (Map.Entry<String, Object> m : map.entrySet()) {
System.out.println("k=" + m.getKey() + " v=" + m.getValue());
}
pojo.name = "Banana";
for (Map.Entry<String, Object> m : map.entrySet()) {
System.out.println("k=" + m.getKey() + " v=" + m.getValue());
}
输出
k=66e8c013 v=MyPojo{name='Apple'}
k=66e8c013 v=MyPojo{name='Banana'}
注意:代码和输出已被剥离到相关部分
所以,如果我修改我的 pojo 对象,它也会在原来的 Map 中发生变化。对我来说,杰克逊似乎没有在内部调用“new MyPojo()”并在之后为每个找到的变量设置值。
我能做些什么来防止这种情况发生?有替代方法吗?我是否需要创建一个复制构造函数才能在不引用 Map 中的值的情况下获得一个真正的新对象?
此外,如果有人能告诉我 convertValue 实际做了什么,那就太好了。
【问题讨论】:
-
那么,您正在尝试将 MyPojo 转换为 MyPojo?当你这样做时,Jackson 不会做任何事情:它只会返回原始的 MyPojo,因为不需要转换任何东西。
-
源代码永远是你最好的代码源代码。
-
@JBNizet 不一定。通常是
LinkedHashMap,在这种情况下,错误没有发生。虽然在这种特殊情况下查看调试器是正确的 - 所以谢谢。 -
@JarrodRoberson 我不知道您为什么将其作为副本关闭?我没有问过“如何克隆一个对象”——我完全清楚我的选择。最初,我试图了解我的代码中发生了什么。所以关闭似乎不合适 - 没有冒犯。