将数组转换为多个对象

huangapple go评论60阅读模式
英文:

Jolt transform array into multiple Objects

问题

I am trying to transform the below JSON:

Input:

{
  "steps": [
    {
      "end": "2023-01-27T09:19:29.849298Z",
      "id": "1",
      "start": "2023-01-27T09:18:24.59325Z",
      "name": "foo"
    },
    {
      "end": "2023-01-28T09:19:29.849298Z",
      "id": "2",
      "start": "2023-01-28T09:18:24.59325Z",
      "name": "bar"
    }
  ]
}

Output:

{
  "steps": [
    {
      "end": "2023-01-27T09:19:29.849298Z",
      "id": "1",
      "name": "foo",
      "start": "2023-01-27T09:18:24.59325Z"
    },
    {
      "end": "2023-01-28T09:19:29.849298Z",
      "id": "2",
      "name": "bar",
      "start": "2023-01-28T09:18:24.59325Z"
    }
  ],
  "date": [
    {
      "name": "startDate",
      "value": "2023-01-27T09:18:24.59325Z" //steps[0].start
    },
    {
      "name": "endDate",
      "value": "2023-01-27T09:19:29.849298Z" //steps[0].end
    }
  ]
}

I tried using the below spec:

[
  {
    "operation": "shift",
    "spec": {
      "steps": {
        "*": "steps[]",
        "0": {
          "#startDate": "date[0].name",
          "start": "date[0].value",
          "end": "date[1].value",
          "#endDate": "date[1].name"
        }
      }
    }
  }
]

But "*": "steps[]" only transforms the last element of the array steps. Please guide me as to what is wrong with the above spec, as I am new to jolt. Also, any pointers to the correct operations needed to achieve the above output will be greatly appreciated.

英文:

I am trying to transform the below JSON:

Input:

{
  "steps": [
    {
      "end": "2023-01-27T09:19:29.849298Z",
      "id": "1",
      "start": "2023-01-27T09:18:24.59325Z",
      "name": "foo"
    },
    {
      "end": "2023-01-28T09:19:29.849298Z",
      "id": "2",
      "start": "2023-01-28T09:18:24.59325Z",
      "name": "bar"
    }
  ]
}

Output:

{
  "steps": [
    {
      "end": "2023-01-27T09:19:29.849298Z",
      "id": "1",
      "name": "foo",
      "start": "2023-01-27T09:18:24.59325Z"
    },
    {
      "end": "2023-01-28T09:19:29.849298Z",
      "id": "2",
      "name": "bar",
      "start": "2023-01-28T09:18:24.59325Z"
    }
  ],
  "date": [
    {
      "name": "startDate",
      "value": "2023-01-27T09:18:24.59325Z" //steps[0].start
    },
    {
      "name": "endDate",
      "value": "2023-01-27T09:19:29.849298Z" //steps[0].end
    }
  ]
}

I tried using the below spec:

[
  {
    "operation": "shift",
    "spec": {
      "steps": {
        "*": "steps[]",
        "0": {
          "#startDate": "date[0].name",
          "start": "date[0].value",
          "end": "date[1].value",
          "#endDate": "date[1].name"
        }
      }
    }
  }
]

But "*": "steps[]" only transforms the last element of the array steps. Please guide me as to what is wrong with the above spec, as I am new to jolt. Also, any pointers to the correct operations needed to achieve the above output will be greatly appreciated.

答案1

得分: 1

你可以使用以下规范:

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "@": "&1",
        "0": {
          "#startDate": "date[0].name",
          "start": "date[0].value",
          "#endDate": "date[1].name",
          "end": "date[1].value"
        }
      }
    }
  }
]

你可以使用@来获取steps数组,并将其放入steps键中,使用&1

英文:

You can use this spec:

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "@": "&1",
        "0": {
          "#startDate": "date[0].name",
          "start": "date[0].value",
          "#endDate": "date[1].name",
          "end": "date[1].value"
        }
      }
    }
  }
]

You can use @ to get the steps array and put it into the steps key with &1.

答案2

得分: 0

以下是翻译好的部分:

One option is to conditionally pick by the existing(steps) array's indexes while walking through it such as

[
  {
    "operation": "shift",
    "spec": {
      "steps": {
        "@1": "", // 从上一层派生整个值,例如复制它
        "0": { // 第一个索引
          "#startDate": "date[&1].name",
          "start": "date[&1].value"
        },
        "*": { // 其他索引(在这种情况下只有一个)
          "#endDate": "date[&1].name", // 使用&1(向上移动一级树)提取包装对象的索引值
          "end": "date[&1].value"
        }
      }
    }
  }
]

the demo on the site http://jolt-demo.appspot.com/ is
将数组转换为多个对象
1: https://i.stack.imgur.com/C8p5h.jpg

英文:

One option is to conditionally pick by the existing(steps) array's indexes while walking through it such as

[
  {
    "operation": "shift",
    "spec": {
      "steps": {
        "@1": "",// derive the whole value from the upper level, eg. replicate it  
        "0": {// the first index
          "#startDate": "date[&1].name",
          "start": "date[&1].value"
        },
        "*": {// the other index(this case there's only one)
          "#endDate": "date[&1].name",// bring the value of the wrapper object'S index by using &1(going up one level the tree) 
          "end": "date[&1].value"
        }
      }
    }
  }
]

the demo on the site http://jolt-demo.appspot.com/ is

将数组转换为多个对象

huangapple
  • 本文由 发表于 2023年2月6日 21:06:08
  • 转载请务必保留本文链接:https://go.coder-hub.com/75361703.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定