使用JacksonJsonPointer

luaexgnf  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(161)

我有一个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文档,但它一点帮助都没有。

qnyhuwrf

qnyhuwrf1#

我发现问题所在了。我不使用pointer.matches(),而是需要检查匹配的结果,看看它是否是一个空节点。

相关问题