Java震动: can't find proper spec for my transformation

标签 java json jolt

我正在努力应对摇晃的转变: 这是我的输入 JSON

{
  "bloc1-1": {
    "bloc1-2": [
      {
        "key": "key1",
        "value": "value1-1"
      },
      {
        "key": "key2",
        "value": "value1-2"
      }
    ]
  },
  "bloc2-1": {
    "bloc2-2": [
      {
        "key": "key1",
        "value": "value2-1"
      },
      {
        "key": "key2",
        "value": "value2-2"
      },
      {
        "key": "key3",
        "value": "value2-3"
      }
    ]
  }
}

这就是我所期待的

{
  "bloc1-key1" : "value1-1",
  "bloc1-key2" : "value1-2",
  "bloc2-key1" : "value2-1",
  "bloc2-key2" : "value2-2",
  "bloc2-key3" : "value2-3"
}

我已经尝试了以下规范,但我无法弄清楚如何在 RHS 中为键添加前缀(@ 应该是第一个字符)

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": {
          "*": {
            "value": "@(1,key)"
          }
        }
      }
    }
  }
]

明白了

{
  "key1" : [ "value1-1", "value2-1" ],
  "key2" : [ "value1-2", "value2-2" ],
  "key3" : "value2-3"
}

如有任何帮助,我们将不胜感激

最佳答案

下面的规范应该可以解决问题:

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": {
          "*": {
            "$2": "keyParts1",
            "key": "keyParts2",
            "value": "values"
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "keyParts1": {
        "*": "[#1].part1"
      },
      "keyParts2": {
        "*": "[#1].part2"
      },
      "values": {
        "*": "[#1].value"
      }
    }
  },
  {
    "operation": "modify-default-beta",
    "spec": {
      "*": {
        "newKey": "=split('-', @(1,part1))",
        "newKeyFirst": "@(1,newKey[0])",
        "newKeyComplete": "=concat(@(1,newKeyFirst),'-',@(1,part2))"
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "value": "@(1,newKeyComplete)"
      }
    }
  }
]

尝试单独应用每个操作(例如在 demo app 中)。

查看 jolt 文档的链接以及 this answer 中的示例


分步说明:

第一个“shift”转换将最终结果的组成部分放置在单独的数组中:

{
  "keyParts1" : [ "bloc1-1", "bloc1-1", "bloc2-1", "bloc2-1", "bloc2-1" ],
  "keyParts2" : [ "key1", "key2", "key1", "key2", "key3" ],
  "values" : [ "value1-1", "value1-2", "value2-1", "value2-2", "value2-3" ]
}

上述操作让我们将最终结果的每个组件定位在所需结果的右侧索引中。 请注意,每个数组具有相同的大小。 在第二个操作中,我们使用 # 运算符按索引对每个数组元素进行分组。看着docs [#1] 可以翻译为:

"Go up one level and ask that node how many matches it has had before finding the current element".

上面的节点是一个数组,因此对于第三个数组元素,它将是数组索引 2

[
  ...
  {
    "part1" : "bloc2-1",
    "part2" : "key1",
    "value" : "value2-1"
  }
  ...
]

在第三个操作中我假设所需结果的关键是“blocX-Y”的“blocX”子字符串的串联 键与 "key" 值连接。这就是我使用“modify-default-beta”的原因。看看the example from the demo app 数组的五个元素中的每一个都与第三个数组元素类似地进行转换:

[
  ...
  {
    "part1" : "bloc2-1",
    "part2" : "key1",
    "value" : "value2-1",
    "newKey" : [ "bloc2", "1" ],
    "newKeyFirst" : "bloc2",
    "newKeyComplete" : "bloc2-key1"
  }
  ...
]

最后一个操作从第三个操作的输出中产生所需的结果。

关于Java震动: can't find proper spec for my transformation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70975621/

相关文章:

c++ - 对 QJsonArray 进行排序

java - 使用 Gson 将 JSON 转换为 Java 对象

java - 具有不同名称的Spring json map元素要列出

java - 数组输入的 Jolt 变换 JSON 规范

java - 如何使用 Jolt 转换数组?

java - JSF - session 范围的托管 bean 没有在 session 反序列化时重新注入(inject)的依赖项

java - Sprint 事务 - 如果内部事务失败,则需要 REQUIRES_NEW 行为

java - 无法将大于 1.5 MB 的文件添加到存储库

java - 为什么不能设置随机颜色?

json - 颠簸变换 OMH 映射到 FHIR