java - 使用杰克逊在 JSON 中插入和删除内部节点?
问题描述
我有一个复杂的 json 和一个键列表,它们代表我想要访问、删除或插入的特定节点的任意长“路径”。
那可能吗?
例如对于 json
{
"token": {
"d1": 3000,
"d2": [
{
"d3": "a1",
"d4": "a2"
}
],
"d5": [
"d6",
"d7"
],
"d8": {
"d9": true,
"d10": 10000
}
}
和清单
['token','d2','d3']
对于插入命令,结果
removeFromJson(jsonString,key_path)
将会
{
"token": {
"d1": 3000,
"d2": [
{
"d4": "a2"
}
],
"d5": [
"d6",
"d7"
],
"d8": {
"d9": true,
"d10": 10000
}
}
解决方案
JsonNode
正如托马斯在评论中提到的那样,我会依靠它get
和remove
方法。就像是:
public void remove(String json, List<String> path) {
JsonNode root = new ObjectMapper.readTree(json);
int lastIndex = path.size() - 1;
for (int i = 0; i < lastIndex; i++) {
root = root.get(path.get(i));
}
root = root.remove(path.get(lastIndex));
return root;
}
您可以使用子列表或流进一步优化迭代,并且您可能希望处理您的路径实际上不会导致给定 json 中的任何内容的情况。
注意:如果您需要在任意对象内的任意路径上执行此行为,则此选项有效 -JsonNode
适用于您不知道将获得什么的情况。如果你确实知道你会得到什么(从同一个对象中删除总是相同的东西),最好的形式是使用映射器将 JSON 反序列化为一个对象,该映射器设置忽略对象中缺少但存在于JSON。
推荐阅读
- android - Android kotlin - 为“父”函数返回 int
- sql - 查找不同时间间隔的票号的循环时间
- react-native - 尝试执行“expo publish”时连接 ECONNREFUSED 127.0.0.1:19001
- c# - 如何正确设置 Swagger for PowerApps?
- r - 从数据集创建多线图,一个轴为时间,另一个轴为基因
- c++ - 检查 map::find() 是否找到了东西
- spring-boot - 如何使用 Spring Cloud Stream 供应商向 Kafka 发送密钥消息
- error-handling - Powershell错误输出抑制(再次)
- python - aws cli:错误:root:找不到哈希 md5 的代码
- python - 我的裁剪和堆栈程序上的内存错误