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:
data[].secmeetingdays | [0].*.*
[
[
"M",
"W",
"F"
],
[
"T",
"TH"
]
]
差不多,但还不够。
- 尝试 2:
data[].secmeetingdays | [0].*.* | {join(',',@)}
失败
- 尝试 3:
data[].secmeetingdays | [0].*.*.join(',',@)
失败
- 尝试 4:
data[].secmeetingdays | {join(',',@[0].*.*)}
失败
- 我尝试避免使用 2 个扁平化,以便在连接内部获取一些参考。
尝试 4 data[].secmeetingdays | [0].* | join(',',@[])
.
失败
- 尝试6
data[].secmeetingdays | [0].*.* | @.join(',',[])
给出结果,但不是我想要的:
"M,W,F,T,TH"
更新:
- 尝试 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"]
我知道这里还有其他几个 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:
data[].secmeetingdays | [0].*.*
[
[
"M",
"W",
"F"
],
[
"T",
"TH"
]
]
差不多,但还不够。
- 尝试 2:
data[].secmeetingdays | [0].*.* | {join(',',@)}
失败
- 尝试 3:
data[].secmeetingdays | [0].*.*.join(',',@)
失败
- 尝试 4:
data[].secmeetingdays | {join(',',@[0].*.*)}
失败
- 我尝试避免使用 2 个扁平化,以便在连接内部获取一些参考。
尝试 4 data[].secmeetingdays | [0].* | join(',',@[])
.
失败
- 尝试6
data[].secmeetingdays | [0].*.* | @.join(',',[])
给出结果,但不是我想要的:
"M,W,F,T,TH"
更新:
- 尝试 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"]