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));
我有一个 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));