我有一个JSON响应,可以使用jayway jsonpath语法将其过滤为以下格式:
[
{
"entityName" : "Financial Assets",
"entityFullPath" : [
"Path123",
"Alternative"
]
},
{
"entityName" : "123",
"entityFullPath" : [
"Path123",
"Alternative"
]
}
]
jsonpath:
$..domainEntity[?(@.dataObjectId !== null)].['entityName','entityFullPath']
我要进一步做的是仅从entityFullPath数组中获取第一个值-就是这种情况Path123
,所以最终的JSON看起来像这样:
[
{
"entityName" : "Financial Assets",
"entityFullPath" : [
"Path123"
]
},
{
"entityName" : "123",
"entityFullPath" : [
"Path123"
]
}
]
甚至更好(不确定是否可以仅使用jsonpath摆脱json数组):
[
{
"entityName" : "Financial Assets",
"entityFullPath" : "Path123"
},
{
"entityName" : "123",
"entityFullPath" : "Path123"
}
]
仅使用jsonpath这样的向下追溯可行吗?我使用的是杂货店风味。
答案 0 :(得分:0)
不幸的是,这是不可能的。与XPath不同,JSONPath(到目前为止)不提供用于从给定节点访问父节点或兄弟节点的操作。此外,[,]
联合操作(通常实现)不允许我们加入不同级别的节点;这就是为什么我们被困在这里。
想到的一个不太优雅的解决方法是通过合并两个(或多个)单个JSONPath查询的结果来重新创建目标JSON。这是一个JavaScript的示例,看起来像这样:
let json = [
{
"entityName" : "Financial Assets",
"entityFullPath" : [
"Path123",
"Alternative"
]
},
{
"entityName" : "123",
"entityFullPath" : [
"Path123",
"Alternative"
]
}
];
var a = JSONPath.JSONPath({path: '$.[*].entityName', json: json});
//= [
// "Financial Assets",
// "123"
//];
var b = JSONPath.JSONPath({path: '$.[*].entityFullPath.[0]', json: json});
//= [
// "Path123",
// "Path123"
//];
const result = Object.assign({}, [{"entityName":a[0], "extern_uid":b[0]},
{"entityName":a[1], "extern_uid":b[1]}]);
console.log(result);
<script src="https://cdn.jsdelivr.net/npm/jsonpath-plus@4.0.0/dist/index-umd.min.js"></script>
最好使用上一个结果并根据常规代码访问所需的属性。