使用 jackson 在 JSON 中插入和删除内部节点?
Using jackson to insert and remove inner nodes in a JSON?
我有一个复杂的 json 和一个键列表,它代表一个任意长 "path" 到我想访问、删除或插入的特定节点。
这可能吗?
例如 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
,正如 Thomas 在评论中提到的,它的 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.[=15= 内的任何内容的情况]
注意: 如果您需要在任意对象内的任意路径上执行此行为,则此选项有效 - JsonNode
正好适用于您不需要的情况不知道你会得到什么。如果你 do 知道你会得到什么(从同一个对象中删除的总是相同的东西),那么将你的 JSON 反序列化为一个对象可能是更好的形式使用映射器设置忽略对象中缺少但存在于 JSON.
中的字段
我有一个复杂的 json 和一个键列表,它代表一个任意长 "path" 到我想访问、删除或插入的特定节点。
这可能吗?
例如 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
,正如 Thomas 在评论中提到的,它的 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.[=15= 内的任何内容的情况]
注意: 如果您需要在任意对象内的任意路径上执行此行为,则此选项有效 - JsonNode
正好适用于您不需要的情况不知道你会得到什么。如果你 do 知道你会得到什么(从同一个对象中删除的总是相同的东西),那么将你的 JSON 反序列化为一个对象可能是更好的形式使用映射器设置忽略对象中缺少但存在于 JSON.