JSON の一部の key value を削除する ( Jackson JsonNode )

巨大なJSON、階層が深かったり値の文字列がとても長かったりする時は、整形したとしても
とても見にくく目視確認に困る。
確認しなくても済むものは、取り除いてしまいたい。
以下、そんなに大きくないJSON でそういう場合の方法、Jacksonライブラリの JsonNode
対象JSON が読み込めている前提でサンプルを示す。

{
  "A" : 123,
  "B" : {
    "B01" : "b01-01234",
    "B02" : {
      "detail" : "詳細~",
      "name" : "orange"
    }
  },
  "C" : [ {
    "C01" : {
      "size" : 230
    }
  }, {
    "C02" : {
      "size" : 380
    }
  }, {
    "C03" : {
      "size" : 670
    }
  } ],
  "D" : "Document"
}

このJSON文字列が読み込んだ結果の JsonNode インスタンスnode だとする。

"D" : "Document" を取り除く場合
ObjectNode に cast して、JsonNode remove(String propertyName) メソッドを実行する。

((ObjectNode)node).remove("D");

node インスタンスから "D" key と valueが削除されてしまうことに注意

深い階層は、JsonNode の path(String) で対象ノードまで連結して JsonNode を求めてから
ObjectNode に cast して remove(String) を実行する。

上の、"B" ⇒ "B02" ⇒ "detail" を削除する場合、

((ObjectNode)(node.path("B").path("B02"))).remove("detail");

配列の1個を削除する場合は、JsonNode から ArrayNode に cast して
remove(int index) メソッドで削除する

((ArrayNode)(node.path("C"))).remove(1);

これら、

((ObjectNode)node).remove("D");
((ObjectNode)(node.path("B").path("B02"))).remove("detail");
((ArrayNode)(node.path("C"))).remove(1);

を実行した結果の JsonNode node は、以下になる。

{
  "A" : 123,
  "B" : {
    "B01" : "b01-01234",
    "B02" : {
      "name" : "orange"
    }
  },
  "C" : [ {
    "C01" : {
      "size" : 230
    }
  }, {
    "C03" : {
      "size" : 670
    }
  } ]
}