arrays - jayway jsonpath过滤内部json数组
问题描述
我有一个 JSON 响应,我能够使用 jayway jsonpath 语法将其过滤为如下格式:
[
{
"entityName" : "Financial Assets",
"entityFullPath" : [
"Path123",
"Alternative"
]
},
{
"entityName" : "123",
"entityFullPath" : [
"Path123",
"Alternative"
]
}
]
json路径:
$..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 进行这种深入研究是否可行?我用的是jayway的味道。
解决方案
不幸的是,这是不可能的。与 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>
可以说最好使用以前的结果并根据需要在常规代码中访问属性。
推荐阅读
- java - 如何为抽象类或接口的子类型实现访问者模式?
- amazon-web-services - AWS Athena 查询输出格式
- amazon-cloudformation - 更新依赖堆栈
- python - 如何四舍五入到小数点后4位?
- c - 外部 RAM 工作和内存管理
- c++ -
将 shared_ptr作为 shared_ptr传递 - docker - Eclipse 中的 Docker 映像构建问题
- javascript - Chrome 错误的控制台:拒绝应用样式,因为它的 MIME 类型('text/html')
- flutter - 我是否需要手动在 appbar 中配置我的后退按钮?
- android - Android将自定义视图xml添加到Activity