jayway json路径过滤器内部 json 数组

jayway jsonpath filter inner json array

我有一个 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 flavor.

不幸的是,这是不可能的。与 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>

最好使用之前的结果并在常规代码中根据需要访问属性。