うっかり 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 ] }