
本文介绍如何使用 JOLT 的 shift 转换,将 JSON 数据中位于未知层级的特定字段提取到一个数组中。即使输入 JSON 的层级结构不固定,也能通过简单的 JOLT 规范实现目标,确保输出始终为一个包含提取值的数组。核心在于利用 JOLT shift 规范中的数组语法,强制生成数组结果,从而简化数据处理流程。
动态提取多层级 JSON 数据到数组的 JOLT Shift 转换
JOLT (JSON to JSON transformation) 是一种强大的 JSON 转换工具,可以用于重塑、过滤和转换 JSON 数据。 本文将重点介绍如何使用 JOLT 的 shift 操作,从具有动态层级结构的 JSON 数据中提取特定字段,并将它们收集到一个数组中。
问题描述
假设我们有一个 JSON 输入,其结构可能包含嵌套的 item 数组,并且嵌套的深度是不确定的。 我们的目标是从这些嵌套的 item 对象中的 foo 对象提取 nn 字段的值,并将它们收集到一个名为 type 的数组中。
例如,考虑以下输入:
{
"id": 1,
"item": [
{
"id": "1_1",
"foo": {
"id": 1232,
"nn": "sdfsd"
}
}
]
}我们期望的输出是:
{
"type": [
"sdfsd"
]
}JOLT Shift 规范
解决此问题的关键在于使用 JOLT shift 操作符,并利用数组语法 [] 来强制生成数组结果。 以下是一个有效的 JOLT 规范:
[
{
"operation": "shift",
"spec": {
"item": {
"*": {
"item": {
"*": {
"item": {
"*": {
"foo": {
"nn": "type[]"
}
}
},
"foo": {
"nn": "type[]"
}
}
},
"foo": {
"nn": "type[]"
}
}
}
}
}
]解释:
- "operation": "shift":指定要执行的操作是 shift。
- "spec":定义了转换的规则。
- "item": 匹配输入 JSON 中的 item 字段。
- "*": 匹配 item 数组中的任何元素。 这允许我们遍历未知深度的嵌套 item 数组。
- "foo":匹配 item 中的 foo 对象。
- "nn":匹配 foo 对象中的 nn 字段。
- "type[]":将 nn 字段的值移动到输出 JSON 中名为 type 的数组中。 关键在于 [],它告诉 JOLT 始终生成一个数组,即使只有一个匹配项。
示例
假设我们有以下 JSON 输入:
{
"id": 1,
"item": [
{
"id": "1_1",
"foo": {
"id": 1232,
"nn": "sdfsd"
}
},
{
"id": "1_2",
"item": [
{
"id": "2_1",
"foo": {
"id": 4567,
"nn": "dfsds"
}
}
]
}
]
}使用上述 JOLT 规范,我们将得到以下输出:
{
"type": [
"sdfsd",
"dfsds"
]
}即使输入 JSON 中 item 数组的嵌套深度不同, JOLT 也能正确地提取所有 nn 字段的值并将它们放入 type 数组中。
注意事项
- 上述 JOLT 规范假定 nn 字段始终存在于 foo 对象中。 如果 nn 字段可能不存在,则需要添加额外的逻辑来处理这种情况,例如使用 default 操作符。
- JOLT 规范的复杂性取决于输入 JSON 结构的复杂性。 对于更复杂的结构,可能需要更复杂的 JOLT 规范。
总结
通过使用 JOLT 的 shift 操作符和数组语法,我们可以轻松地从具有动态层级结构的 JSON 数据中提取特定字段,并将它们收集到一个数组中。 这使得我们可以轻松地处理各种 JSON 数据,而无需编写复杂的代码。
这段 JOLT 规范提供了一种简洁有效的方法来处理未知层级的 JSON 数据,并确保输出始终为一个数组,从而简化了后续的数据处理步骤。









