私の目標は、JsonNodeのいくつかのテキストフィールドを更新することです。
List<JsonNode> list = json.findValues("fieldName");
for(JsonNode n : list){
// n is a TextNode. I'd like to change its value.
}
これがどうやってできるのかわかりません。何か提案はありますか?
簡単に言うと、できません。 TextNode
は、内容を変更できる操作を公開していません。
そうは言っても、ループ内または再帰を介してノードを簡単にトラバースして、目的の動作を得ることができます。以下を想像してみてください:
public class JsonTest {
public static void change(JsonNode parent, String fieldName, String newValue) {
if (parent.has(fieldName)) {
((ObjectNode) parent).put(fieldName, newValue);
}
// Now, recursively invoke this method on all properties
for (JsonNode child : parent) {
change(child, fieldName, newValue);
}
}
@Test
public static void main(String[] args) throws IOException {
String json = "{ \"fieldName\": \"Some value\", \"nested\" : { \"fieldName\" : \"Some other value\" } }";
ObjectMapper mapper = new ObjectMapper();
final JsonNode tree = mapper.readTree(json);
change(tree, "fieldName", "new value");
System.out.println(tree);
}
}
出力は次のとおりです。
{"fieldName": "new value"、 "nested":{"fieldName": "new value"}}
TextNodeを変更することはできないため、代わりにそのフィールドのすべてのparentNodesを取得し、同じフィールド名と新しい値を使用してそのフィールドに対してput操作を呼び出すことができます。既存のフィールドを置き換え、値を変更します。
List<JsonNode> parentNodes = jsonNode.findParents("fieldName");
if(parentNodes != null) {
for(JsonNode parentNode : parentNodes){
((ObjectNode)parentNode).put("fieldName", "newValue");
}
}