如何定义不需要硬编码名称的转换
How to define a transformation that doesn't require hard-coded names
我有一个有效的转换,但它使用的是硬编码的 属性 名称引用。我一直在努力弄清楚如何定义一个通用的转换,但我还没有找到任何有效的方法。
我的输入数据是这样的:
{
"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
}
}
对于第一个想要的结果;
将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
以外的数组
我有一个有效的转换,但它使用的是硬编码的 属性 名称引用。我一直在努力弄清楚如何定义一个通用的转换,但我还没有找到任何有效的方法。
我的输入数据是这样的:
{
"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
}
}
对于第一个想要的结果;
将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