json 将字段值转换为字段名的JOLT规范

gkl3eglg  于 2022-12-24  发布在  其他
关注(0)|答案(2)|浏览(198)

我正在尝试将下面的JSON有效负载转换为一个JSON,该JSON将字段名作为字段的值:
如果字段值不同,我的jolt文件可以正常工作,但是如果字段值相同,它会在响应中给出一个数组。
你能帮忙提供这个震动的规格吗?
输入JSON有效负载:

{
  "action": {
    "Success": true,
    "records": [
      {
        "Id": "Test_abc",
        "SubscriptionID": "ID_1"
      },
      {
        "Id": "Test_abc",
        "SubscriptionID": "ID_2"
      },
      {
        "Id": "Test_xyz",
        "SubscriptionID": "ID_3"
      }
    ],
    "type": "update"
  }
}

预期产出:

{
  "action": {
    "Success": true,
    "records": {
      "Test_abc": {
        "SubscriptionID": "ID_1"
      },
      "Test_abc": {
        "SubscriptionID": "ID_2"
      },
      "Test_xyz": {
        "SubscriptionID": "ID_3"
      }
    },
    "type": "update"
  }
}

尚未找到解决方案。

py49o6xq

py49o6xq1#

您可以使用以下shift转换规范

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "&1.&", // &1 replicates the literal "action"
        "records": {
          "*": {
            "S*": "&3.&2.@(1,Id).&" // &3 replicates the literal "action" (by going three level up the tree), &2 for "records", & replicates the current level attribute
          }
        }
      }
    }
  }
]

假定将其中一个Id值从Test_abc转换为另一个值,例如Test_def,因为所需的输出错误地作为JSON值(同一级别上不能有多个具有相同标记的对象)

ifmq2ha2

ifmq2ha22#

您的输出错误。不能有多个具有相同键的对象。
如果你想支持recordsarray的所有对象,你应该把它们放到一个数组中,如下所示:

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "&1.&",
        "records": {
          "*": {
            "S*ID": "&3.&2[].@(1,Id).&"
          }
        }
      }
    }
  }
]

但是,如果您希望在输出中有一个对象作为您的records,您应该删除重复的ID,如下所示:

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "&1.&",
        "records": {
          "*": {
            "S*ID": "&3.&2.@(1,Id).&"
          }
        }
      }
    }
  },
  {
    "operation": "cardinality",
    "spec": {
      "*": {
        "records": {
          "*": {
            "*": "ONE"
          }
        }
      }
    }
  }
]

相关问题