我有一个Json对象如下:
{“name”:“john doe”,“ssn”:电话:111-22-3333
我想用空字符串替换ssn
字段。我知道我可以直接替换,但我试图构建一个通用的lib,可以替换JSON对象中的元素。
我试着用Jackson的JsonPointer
实现来做这件事。
JsonPointer pointer = JsonPointer.compile(path);
JsonNode root = null;
root = mapper.readTree(payload);
JsonNode targetNode = root.at(pointer);
if(!pointer.matches()) {
throw new IOException("Pointer did not match");
}
JsonNode parentNode = root.at(pointer.head());
JsonNode replacementNode = null;
if (targetNode.isTextual()) {
replacementNode = TextNode.valueOf(config.getString(REPLACEMENT_VALUE_STRING));
} else if (targetNode.isInt()) {
replacementNode = IntNode.valueOf(config.getInt(REPLACEMENT_VALUE_INT));
} else if (targetNode.isBigInteger()) {
BigInteger bi = BigInteger.valueOf(config.getInt(REPLACEMENT_VALUE_INT));
replacementNode = BigIntegerNode.valueOf(bi);
} else if (targetNode.isFloat()) {
replacementNode = FloatNode.valueOf(config.getDouble(REPLACEMENT_VALUE_INT).floatValue());
} else if (targetNode.isDouble()) {
replacementNode = DoubleNode.valueOf(config.getDouble(REPLACEMENT_VALUE_DOUBLE));
} else if (targetNode.isArray()) {
replacementNode = mapper.createArrayNode();
}
if (parentNode.isObject()) {
((ObjectNode)parentNode).set(pointer.getMatchingProperty(), replacementNode);
} else if (parentNode.isArray()) {
((ArrayNode)parentNode).set(pointer.tail().getMatchingIndex(), replacementNode);
}
return root;
但是,问题是JsonPointer
没有告诉我是否有实际的匹配。如果没有匹配,则返回一个空节点。然后我的代码最终向JSON添加了一个额外的字段。
例如
输入:{"name": "jon", "age": 30}
输出:`{“name”:“jon”,“age”:30,“ssn”:null}
我试着阅读JacksonJsonPointer文档,但它一点帮助都没有。
1条答案
按热度按时间qnyhuwrf1#
我发现问题所在了。我不使用
pointer.matches()
,而是需要检查匹配的结果,看看它是否是一个空节点。