web-dev-qa-db-ja.com

JavaでJsonNodeを変更する方法は?

JavaでJSON属性の値を変更する必要があります。値を適切に取得できますが、JSONを変更できませんでした。

ここに以下のコードがあります

  JsonNode blablas = mapper.readTree(parser).get("blablas");
    for (JsonNode jsonNode : blablas) {
        String elementId = jsonNode.get("element").asText();
        String value = jsonNode.get("value").asText();
        if (StringUtils.equalsIgnoreCase(elementId, "blabla")) {
            if(value != null && value.equals("YES")){
                 // I need to change the node to NO then save it into the JSON
            }
        }
    }

これを行う最良の方法は何ですか?

82
mstfdz

JsonNodeは不変であり、解析操作を目的としています。ただし、変異を許可するObjectNode(およびArrayNode)にキャストできます。

((ObjectNode)jsonNode).put("value", "NO");

配列の場合、次を使用できます。

((ObjectNode)jsonNode).putArray("arrayName").add(object.ge‌​tValue());
156

@ Sharon-Ben-Asherの答えは大丈夫です。

しかし、私の場合、配列のために私は使用する必要があります:

((ArrayNode) jsonNode).add("value");
3
Alejandro

ObjectNodeにキャストしてputメソッドを使用できると思います。このような

ObjectNode o = (ObjectNode) jsonNode; o.put("value", "NO");

3
Xdsasdf

ObjectNode(自分自身を含む)にキャストしようとすると、この例外が発生する受け入れられた回答のコメントに他の一部が賛成したため、回答を追加します。

Exception in thread "main" Java.lang.ClassCastException: 
com.fasterxml.jackson.databind.node.TextNode cannot be cast to com.fasterxml.jackson.databind.node.ObjectNode

解決策は、「親」ノードを取得し、putを実行して、元のノードタイプに関係なく、ノード全体を効果的に置き換えます。

ノードの既存の値を使用してノードを「変更」する必要がある場合:

  1. getJsonNodeの値/配列
  2. その値/配列で変更を実行します
  3. 親でputの呼び出しに進みます。

目的がsubfieldNode1の子ノードであるNodeAを変更することであるコード:

JsonNode nodeParent = someNode.get("NodeA")
                .get("Node1");

// Manually modify value of 'subfield', can only be done using the parent.
((ObjectNode) nodeParent).put('subfield', "my-new-value-here");

クレジット:

このインスピレーションは here から得たものです。 wassgreen @ のおかげです

2
matrixanomaly

値を設定するには、ObjectNode型オブジェクトを取得する必要があります。 this を見てください

2
Eugen Halca