web-dev-qa-db-ja.com

Java Jackson TextNodeを別のものに置き換えるにはどうすればよいですか(更新)?

私の目標は、JsonNodeのいくつかのテキストフィールドを更新することです。

    List<JsonNode> list = json.findValues("fieldName");
    for(JsonNode n : list){
        // n is a TextNode. I'd like to change its value.
    }

これがどうやってできるのかわかりません。何か提案はありますか?

12
yo_haha

簡単に言うと、できません。 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"}}

22
wassgren

TextNodeを変更することはできないため、代わりにそのフィールドのすべてのparentNodesを取得し、同じフィールド名と新しい値を使用してそのフィールドに対してput操作を呼び出すことができます。既存のフィールドを置き換え、値を変更します。

List<JsonNode> parentNodes = jsonNode.findParents("fieldName");
if(parentNodes != null) {
  for(JsonNode parentNode : parentNodes){
    ((ObjectNode)parentNode).put("fieldName", "newValue");
  }
}
1