JmesPath 连接或连接嵌套的数组元素

JmesPath join or concatenate nested array elements

我知道这里还有其他几个 JmesPath 连接问题,但我遇到了一个单独的问题,我还没有找到任何示例,我需要连接(即连接)一组 JSON 将具有动态命名键的值放入单个元素中。

如果我从以下 JSON 数据结构开始:

{
  "data": [
  {
    "secmeetingdays":
    {
      "dayset_01":
      {
        "day_01": "M",
        "day_02": "W",
        "day_03": "F"
      },
      "dayset_02":
      {
        "day_01": "T",
        "day_02": "TH"
      }
    },
  }]
}

我想以这样的方式结束:

[
  [ 
    "M,W,F"
  ],
  [
    "T,TH"
  ]
]

我已经开始查询以压平数据,但完全受制于连接语法。我尝试的任何方法似乎都不起作用。

  1. 尝试 1data[].secmeetingdays | [0].*.*
[
  [
    "M",
    "W",
    "F"
  ],
  [
    "T",
    "TH"
  ]
]

差不多,但还不够。

  1. 尝试 2data[].secmeetingdays | [0].*.* | {join(',',@)}

失败

  1. 尝试 3data[].secmeetingdays | [0].*.*.join(',',@)

失败

  1. 尝试 4data[].secmeetingdays | {join(',',@[0].*.*)}

失败

  1. 我尝试避免使用 2 个扁平化,以便在连接内部获取一些参考。

尝试 4 data[].secmeetingdays | [0].* | join(',',@[]).

失败

  1. 尝试6 data[].secmeetingdays | [0].*.* | @.join(',',[])给出结果,但不是我想要的:
"M,W,F,T,TH"

更新:

  1. 尝试 7 data[].secmeetingdays[].*.* | [].join(',',@) 让我更接近,但也不是我所需要的:
[
  "M,W,F",
  "T,TH"
]

我也许可以使用这个解决方案,但如果有人对问题有准确的答案,我会保持开放状态。

这里的例子 https://jmespath.org/ 有一个连接,但它只在一个项目列表上。如何在不影响父数组结构的情况下加入子数组?

data[*].secmeetingdays.values(@)[].values(@).join(',', @).to_array(@)

为您提供了示例所需的输出,但我认为将每个字符串包装在一个额外的数组中没有任何好处。


data[].secmeetingdays.values(@) | [*][*].values(@).join(',', @)

(对我而言)产生更合乎逻辑的输出,因为它为 data 数组中的每个项目提供了一个日期集数组:

[
  [
    "M,W,F",
    "T,TH"
  ]
]

请注意,处理此类数据的正确方法是编写一个脚本来迭代对象,解析键并保证在对项目进行排序后有序输出。 JSON 解析器没有义务保持对象属性的顺序与 stored/read 相同,因此盲目地转换为上述数组不一定是您想要的顺序。使用键名来存储顺序是多余的。按时间顺序排列的数据应存储为数组,如下所示:

{
  "data": [
    {
      "secmeetingdays": [
        [
          "M",
          "W",
          "F"
        ],
        [
          "T",
          "TH"
        ]
      ]
    }
  ]
}
 [[0].title,[1].title].join(',', @).to_array(@)
 RESULT: ["some1,some2"]

 [[0].title,[1].title].join(',', @)
 RESULT: "some1,some2"

 [[0].title,[1].title]
 RESULT: ["some1,some2"]