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
}
}
}
これを行う最良の方法は何ですか?
JsonNode
は不変であり、解析操作を目的としています。ただし、変異を許可するObjectNode
(およびArrayNode
)にキャストできます。
((ObjectNode)jsonNode).put("value", "NO");
配列の場合、次を使用できます。
((ObjectNode)jsonNode).putArray("arrayName").add(object.getValue());
@ Sharon-Ben-Asherの答えは大丈夫です。
しかし、私の場合、配列のために私は使用する必要があります:
((ArrayNode) jsonNode).add("value");
ObjectNodeにキャストしてput
メソッドを使用できると思います。このような
ObjectNode o = (ObjectNode) jsonNode; o.put("value", "NO");
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
を実行して、元のノードタイプに関係なく、ノード全体を効果的に置き換えます。
ノードの既存の値を使用してノードを「変更」する必要がある場合:
get
JsonNode
の値/配列put
の呼び出しに進みます。目的がsubfield
とNode1
の子ノードである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 @ のおかげです
値を設定するには、ObjectNode
型オブジェクトを取得する必要があります。 this を見てください