JsonNode を複製した操作に気をつける。

うっかり shallow copy のまま操作してしまうのを注意したい。
サンプル

{
  "A" : "a",
  "B" : {
    "B01" : "b01-01234",
    "B02" : {
      "detail" : "test_sample",
      "name" : {
        "type" : "merge",
        "len" : 12
      }
    }
  },
  "C" : [ 100, 160, 300 ]
}

この JSONを表すString jsonstr から生成する JsonNode を以下のようにすると
shallow copy になってしまう。

ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(jsonstr);
JsonNode node2 = node;

((ObjectNode)(node2.path("B").path("B02"))).put("detail", "test_sample");
((ObjectNode)(node2.path("B").path("B02"))).replace("name", mapper.createObjectNode()
                                           .put("type", "merge").put("len", 12));
((ArrayNode)(node2.path("C"))).set(1, 160);

node2 を変更しているつもりが、node を変更していることになる。
ディープコピー(deepCopy)を使うようにして元の JsonNode が変更されないようにする

JsonNode node2 = node.deepCopy();

((ObjectNode)(node2.path("B").path("B02"))).put("detail", "test_sample");
((ObjectNode)(node2.path("B").path("B02"))).replace("name", mapper.createObjectNode()
                                           .put("type", "merge").put("len", 12));
((ArrayNode)(node2.path("C"))).set(1, 160);

node2 は、

{
  "A" : "a",
  "B" : {
    "B01" : "b01-01234",
    "B02" : {
      "detail" : "test_sample",
      "name" : {
        "type" : "merge",
        "len" : 12
      }
    }
  },
  "C" : [ 100, 160, 300 ]
}