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

Rad*_*Rad 4 java json clone jackson

目标:深层复制(或克隆)Java对象
建议的方法之一(几乎无处不在)使用Jackson:

MyPojo myPojo = new MyPojo();
ObjectMapper mapper = new ObjectMapper();
MyPojo newPojo = mapper.readValue(mapper.writeValueAsString(myPojo), MyPojo.class);
Run Code Online (Sandbox Code Playgroud)

问题:以下是更好的吗?在表现方面?有什么缺点吗?

MyPojo myPojo = new MyPojo();
ObjectMapper mapper = new ObjectMapper();
MyPojo newPojo = mapper.treeToValue(mapper.valueToTree(myPojo), MyPojo.class);
Run Code Online (Sandbox Code Playgroud)

Rad*_*Rad 7

由Tatu Saloranta回答:

第二种方式应该更高效,因为它只创建和使用逻辑令牌流,但不必编码JSON,然后将其解码(解析)到令牌流或从令牌流解析.所以关于杰克逊的情况接近最佳.

关于使其更加优化的唯一方法是直接使用TokenBuffer(这是杰克逊自己用于缓冲的东西).就像是:

TokenBuffer tb = new TokenBuffer(); // or one of factory methods
mapper.writeValue(tb, myPojo);
MyPojo copy = mapper.readValue(tb.asParser(), MyPojo.class);
Run Code Online (Sandbox Code Playgroud)

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

谢谢Tatu :)

  • 可以使用 ``TokenBuffer tb = new TokenBuffer(objectMapper, false);``` 创建 TokenBuffer (4认同)
  • 你是如何构建 TokenBuffer 的?它需要不同的参数,我不确定在通用克隆函数中使用什么。 (3认同)
  • 这是杰克逊的作者,是你能找到的最好的参考资料。顺便问一下,你从哪里得到答案?:) (2认同)