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


109

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
            }
        }
    }

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


1
JsonNodeをJava Mapに変換できます。たとえばresultMap = mapper.convertValue(aJsonNode, Map.class);、Mapで変更してから、そのMapをJsonNodeに戻します。ただ言って。
MikeJRamsey56

回答:


195

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

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

配列の場合は、以下を使用できます。

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

4
値を変更する必要がある数値型を試してみました。私はこの例外を受けました:Exception in thread "main" java.lang.ClassCastException: com.fasterxml.jackson.databind.node.IntNode cannot be cast to com.fasterxml.jackson.databind.node.ObjectNode
balboa_21

「IntNode」を試す必要があります
mulya

6

他の人が受け入れた回答のコメントに賛成して回答を追加すると、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. get の値/配列 JsonNode
  2. その値/配列に変更を加えます
  3. 引き続きput親を呼びます。

andのsubfield子ノードであるを変更することを目的とするコード:NodeANode1

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");

クレジット:

wassgreen @のおかげここからこのインスピレーションを得ました


5

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

しかし、私の場合、配列には以下を使用する必要があります。

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

4

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

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



0

全体像がはっきりしないかもしれない他の人を理解するために、次のコードは私がフィールドを見つけてそれを更新するのに役立ちます

ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(JsonString);    
JsonPointer valueNodePointer = JsonPointer.compile("/GrandObj/Obj/field");
JsonPointer containerPointer = valueNodePointer.head();
JsonNode parentJsonNode = rootNode.at(containerPointer);

if (!parentJsonNode.isMissingNode() && parentJsonNode.isObject()) {
    ObjectNode parentObjectNode = (ObjectNode) parentJsonNode;
    //following will give you just the field name. 
    //e.g. if pointer is /grandObject/Object/field
    //JsonPoint.last() will give you /field 
    //remember to take out the / character 
    String fieldName = valueNodePointer.last().toString();
    fieldName = fieldName.replace(Character.toString(JsonPointer.SEPARATOR), StringUtils.EMPTY);
    JsonNode fieldValueNode = parentObjectNode.get(fieldName);

    if(fieldValueNode != null) {
        parentObjectNode.put(fieldName, "NewValue");
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.