【问题标题】:How to define a transformation that doesn't require hard-coded names如何定义不需要硬编码名称的转换
【发布时间】:2021-10-22 22:56:07
【问题描述】:

我有一个有效的转换,但它使用的是硬编码的属性名称引用。我一直在试图弄清楚如何定义一个通用的转换,但我没有找到任何可行的方法。

我的输入数据如下所示:

{
  "data": [
    {
      "A": 1,
      "B": "testing",
      "C": 100
    },
    {
      "A": 2,
      "B": "testing",
      "C": 200
    }
  ],
  "newVals": {
    "B": "new val",
    "C": 7
  }
}

我想应用 newVals 对象中的值并将它们应用到数组中的对象,以便生成的数据如下所示:

[
  {
    "A": 1,
    "B": "new val",
    "C": 7
  },
  {
    "A": 2,
    "B": "new val",
    "C": 7
  }
]

我的转换正在工作,但需要对属性名称进行硬编码。我正在尝试定义一个允许正确修改任何匹配属性名称的转换。这样,如果另一个数据集有一个属性“D”,在 newVals 对象中有一个新值,它就会被应用。

我的硬编码转换如下所示:

[
  {
    "operation": "modify-default-beta",
    "spec": {
      "data": {
        "*": {
          "new_B": "@(3,newVals.B)",
          "new_C": "@(3,newVals.C)"
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "data": {
        "*": {
          "@(0,A)": "[#2].A",
          "@(0,new_B)": "[#2].B",
          "@(0,new_C)": "[#2].C"
        }
      }
    }
  }
]

有没有办法这样写,除了上面的示例数据之外,它还可以转换:

{
  "data": [
    {
      "A": 1,
      "E": "testing",
      "F": 100
    }
  ],
  "newVals": {
    "E": "new val",
    "F": 7
  }
}

【问题讨论】:

    标签: json jolt


    【解决方案1】:

    对于第一个想要的结果

    modify-default-beta 转换为 modify-overwrite-beta 规范,这种情况下不需要重命名键,例如。 new_ 前缀不是必需的。同时,无需显式编写每个元素,而是将它们替换为"*": "@(3,newVals.&)"。然后只需在 shift 规范中选择 data 数组的对象,例如

    [
      {
        "operation": "modify-overwrite-beta",
        "spec": {
          "data": {
            "*": {
              "*": "@(3,newVals.&)"
            }
          }
        }
      },
      {
        "operation": "shift",
        "spec": {
          "data": {
            "@": ""
          }
        }
      }
    ]
    

    对于第二个想要的结果

    仅使用 shift 规范的一个步骤就足够了,例如

    [
      {
        "operation": "shift",
        "spec": {
          "data": {
            "0": {
              "A": "&2.[#2].&",
              "B": "&2.[#2].E",
              "C": "&2.[#2].F"
            }
          },
          "*": "&"
        }
      }
    ]
    

    其中"*": "&"用于表示data以外的数组

    【讨论】:

    • 太漂亮了!非常感谢
    猜你喜欢
    • 2012-10-03
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多