使用 Jackson 进行深度复制:String 或 JsonNode

问题描述 投票:0回答:2

目标:Java 对象的深拷贝(或克隆)
建议的方法之一(几乎在任何地方)都是使用 Jackson:

MyPojo myPojo = new MyPojo();
ObjectMapper mapper = new ObjectMapper();
MyPojo newPojo = mapper.readValue(mapper.writeValueAsString(myPojo), MyPojo.class);

问题:下面那个更好吗?在性能方面?有什么缺点吗?

MyPojo myPojo = new MyPojo();
ObjectMapper mapper = new ObjectMapper();
MyPojo newPojo = mapper.treeToValue(mapper.valueToTree(myPojo), MyPojo.class);
java json jackson clone
2个回答
23
投票

Tatu Saloranta 回答:

第二种方式应该更有效一些,因为它只创建和使用 逻辑令牌流,但不必对 JSON 进行编码,然后将其解码(解析)到令牌流或从令牌流中解码(解析)。所以这接近最佳值 杰克逊。

唯一能让它变得更加优化的就是直接 使用

TokenBuffer
(这是 Jackson 本身用于缓冲的)。比如:

TokenBuffer tb = new TokenBuffer(new ObjectMapper(), false);
mapper.writeValue(tb, myPojo);
MyPojo copy = mapper.readValue(tb.asParser(), MyPojo.class);

这将进一步消除树模型的构建和遍历。我不知道它会产生多大的差异,但代码并不多。

谢谢塔图:)


0
投票

我在迭代过程中复制了我的“valueNode”,并使用 ObjectMapper 制作了它的副本,现在“copyJsonNode”是“valueNode”的副本,我需要进一步实现它。

  if (entry.getKey().equalsIgnoreCase("admin")) {

                JsonNode valueNode = entry.getValue();
                
                String copyjson = valueNode.toString();

                ObjectMapper objectMapper = new ObjectMapper();

                JsonNode copyJsonNode = objectMapper.readTree(copyjson);

               ....}
© www.soinside.com 2019 - 2024. All rights reserved.