Java 中是否有 JSON 库可以轻松替换 JSON 树中的值,而我只知道值而不是 field/key 映射到它的值?

Is there JSON library in Java to easily replace a value in a JSON tree where I only know the value but not field/key that maps to it?

我有一个 JsonNode (Jackson) 对象,我想替换其中的特定值。是否有 Json 库可以帮助找到映射到特定值的字段,或者我是否需要递归遍历它。

例如,我想用某个对象替换下面 json 中的占位符。我想知道是否有来自 Jackson 或其他图书馆的 API 我可以利用它来完成一行。请注意,我不知道要搜索的字段,但我知道值是“{replaceValueHereWithAnyObject}”。

{
    "foo": {
        "bar": {
            "new": {
                "abc": "{replaceValueHereWithAnyObject}"
            }
        }
    }
}

ObjectNode.replace(...) 似乎仅将字段作为输入并替换该字段的值。就我而言,我不知道哪个字段映射到我想要替换的已知值。

我不了解某个图书馆(顺便说一下,寻求图书馆推荐可能会导致问题以“离题”为由关闭),但自己做起来并不难。下面是一段用于递归遍历和就地编辑的代码。它只查看文本节点,替换始终是文本节点,但您可以根据需要进行调整。

// Walk the JSON tree and modify textual fields in-place.
public static void transformTextFields(JsonNode node, Function<String, String> transformer) {
  if (node.isObject()) {
    // take a snapshot of the field names to avoid concurrent modification
    final List<String> fieldNames = new ArrayList<>(node.size());
    node.fieldNames().forEachRemaining(fieldNames::add);

    for (String fieldName : fieldNames) {
      final JsonNode child = node.get(fieldName);
      if (child.isContainerNode()) {
        transformTextFields(child, transformer);
      } else if (child.isTextual()) {
        final String oldValue = child.textValue();
        ((ObjectNode) node).set(fieldName, new TextNode(transformer.apply(oldValue)));
      }
    }
  } else if (node.isArray()) {
    for (int i = 0; i < node.size(); i++) {
      final JsonNode child = node.get(i);
      if (child.isContainerNode()) {
        transformTextFields(child, transformer);
      } else if (child.isTextual()) {
        final String oldValue = child.textValue();
        ((ArrayNode) node).set(i, new TextNode(transformer.apply(oldValue)));
      }
    }
  }
}

像这样调用它:

transformTextFields(myJsonNode, fieldValue -> replaceMyPlaceholder(fieldValue));