Преобразование Jolt Spec с вложенной структурой Array

У меня есть JSON типа

{
  "Product": [
    {
      "id": 123,
      "name": "foo",
      "ProductCharge": [
        {
          "productCode": "PIIB",
          "configLevel": "PROD",
          "feeRate": [
            {
              "rate": 123,
              "range": "123"
            },
            {
              "rate": 321,
              "range": "321"
            }
          ]
        }
      ]
    }
  ]
}

который я хочу преобразовать в это

{
  "Product" : [ {
    "id": 123,
      "name": "foo",
   // more fields
    "ProductCharge" : [ {
      "productCode" : "PIIB",
      "configLevel" : "PROD",
      "rate" : 123,
      "range" : "123"
    }, {
      "productCode" : "PIIB",
      "configLevel" : "PROD",
      "rate" : 321,
      "range" : "321"
    } ]
  } ]
}

У меня есть эта спецификация,

[
  {
    "operation": "shift",
    "spec": {
      "Product": {
        "*": {
          // Preserve the id, name, and any other top-level fields
          "ProductCharge": {
            "*": {
              "feeRate": {
                "*": {
                  "@2": { "*": "Product[#6].ProductCharge.[&1].&" },
                  "*": "Product[#6].ProductCharge.[&1].&"
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "remove",
    "spec": {
      "Product": {
        "*": {
          "ProductCharge": {
            "*": {
              "feeRate": ""
            }
          }
        }
      }
    }
  }
]

В моей текущей спецификации отсутствуют «идентификатор», «имя» и другие поля в разделе «Продукт». Если я попытаюсь добавить эту строку, чтобы получить остальные поля в разделе «Продукт», это исказит всю структуру.

"*": "Product[#2].&"

Может кто-нибудь подсказать, как это обойти.

Редактировать:

Барбарос, ваше решение сработало, но я понял, что у меня есть более одного ProductCharge, как показано ниже.

{
  "Product": [
    {
      "id": 123,
      "name": "foo",
      "ProductCharge": [
        {
          "aboveAmount": 0,
          "chargeType": "ABC",
          "chargeValueType": "PERCENT",
          "frequency": 1,
          "feeRate": [
            {
              "bandNumber": 1,
              "rate": 0.6
            },
            {
              "bandNumber": 2,
              "rate": 1.7
            }
          ]
        },
        {
          "aboveAmount": 0,
          "chargeType": "DEF",
          "chargeValueType": "PERCENT",
          "frequency": 1,
          "feeRate": [
            {
              "bandNumber": 1,
              "rate": 0.75
            },
            {
              "bandNumber": 2,
              "rate": -0.55
            }
          ]
        }
      ]
    }
  ]
}

вместо того, чтобы создавать его как 4 отдельных раздела

{
  "Product" : [ {
    "id" : 123,
    "name" : "foo",
    "ProductCharge" : [ {
      "aboveAmount" : 0,
      "chargeType" : "ABC",
      "chargeValueType" : "PERCENT",
      "frequency" : 1,
      "bandNumber" : 1,
      "rate" : 0.6
    }, {
      "aboveAmount" : 0,
      "chargeType" : "ABC",
      "chargeValueType" : "PERCENT",
      "frequency" : 1,
      "bandNumber" : 2,
      "rate" : 1.7
    }, {
      "aboveAmount" : 0,
      "chargeType" : "DEF",
      "chargeValueType" : "PERCENT",
      "frequency" : 1,
      "bandNumber" : 1,
      "rate" : 0.75
    }, {
      "aboveAmount" : 0,
      "chargeType" : "DEF",
      "chargeValueType" : "PERCENT",
      "frequency" : 1,
      "bandNumber" : 2,
      "rate" : -0.55
    } ]
  } ]
}

оно творит вот так;

{
  "Product" : [ {
    "id" : 123,
    "name" : "foo",
    "ProductCharge" : [ {
      "aboveAmount" : [ 0, 0 ],
      "chargeType" : [ "ABC", "DEF" ],
      "chargeValueType" : [ "PERCENT", "PERCENT" ],
      "frequency" : [ 1, 1 ],
      "bandNumber" : [ 1, 1 ],
      "rate" : [ 0.6, 0.75 ]
    }, {
      "aboveAmount" : [ 0, 0 ],
      "chargeType" : [ "ABC", "DEF" ],
      "chargeValueType" : [ "PERCENT", "PERCENT" ],
      "frequency" : [ 1, 1 ],
      "bandNumber" : [ 2, 2 ],
      "rate" : [ 1.7, -0.55 ]
    } ]
  } ]
}

Добро пожаловать в СО Махеш

Barbaros Özhan 29.08.2024 15:53
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
2
1
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете лучше справиться с этой проблемой, накапливая внутренние элементы (те, что находятся в массиве "feeRate") в новом объекте, а именно "Others", используя символы амперсанда-заполнителя для таких ключей, как «Product», «ProductCharge» и «feeRate», например,

[
  {
    "operation": "shift",
    "spec": {
      "Product": {
        "*": {
          "*": "&2[&1].&",
          "ProductCharge": {
            "*": {
              "*": "&4[&3].&2[&1].Others.&",
              "feeRate": "&4[&3].&2[&1].&"
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "Product": {
        "*": {
          "*": "&2[&1].&",
          "ProductCharge": {
            "*": {
              "feeRate": {
                "*": {
                  "@2,Others": { "*": "&7[&6].&5[&1].&" },
                  "*": "&6[&5].&4[&1].&"
                }
              }
            }
          }
        }
      }
    }
  }
]

демо на сайте Демо-версия Jolt Transform с использованием v0.1.1 это:

Обновлено: вам нужно будет добавить еще один раздел для этого нового случая, и выражение &3_&1 сделает свое дело, например

[
  {
    "operation": "shift",
    "spec": {
      "Product": {
        "*": {
          "*": "&2.&",
          "ProductCharge": {
            "0": { //in order to bring only once among duplicated values
              "*": "&4.&2.Others.&",
              "feeRate": {
                "*": {
                  "*": "&6.&4.&2.&3_&1.&"
                }
              }
            },
            "*": {
              "feeRate": {
                "*": {
                  "*": "&6.&4.&2.&3_&1.&"
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "Product": {
        "*": "&1[0].&",
        "ProductCharge": {
          "feeRate": {
            "*": {
              "@": "&4[0].&3.[#2]",
              "@2,Others": { "*": "&5[0].&4.[#3].&" }
            }
          }
        }
      }
    }
  }
]

Эта последняя спецификация также будет обрабатывать предыдущий случай.

Спасибо, Барбарос. Это сработало, как и ожидалось, но когда я подключил дополнительный ProductCharge, кажется, что они сжимаются в массив, а не в отдельную объектную структуру;

Mahesh Gopalan 29.08.2024 14:02

Я добавил обновленный раздел и отметил его Edit: . Сообщите мне, правильно ли это было сделано

Mahesh Gopalan 29.08.2024 14:26

Барбарос, я только что заметил, что упустил из виду тот факт, что преобразование сохраняет значения, соответствующие Others первому ProductCharge объекту. Даже им нужно измениться в связи с ProductCharge. Таким образом, значения aboveAmount, chargeType и т. д. также необходимо будет изменить. Я пытался разобраться в том, как оно устроено, но мне не удалось сделать это правильно.

Mahesh Gopalan 29.08.2024 17:58

не уверен, есть ли у вас изменения, чтобы увидеть мой последний комментарий. Я потратил некоторое время, пытаясь заставить преобразование работать Others и быть динамичным для каждого ProductCharge, но мне это не удалось. Когда у вас будет несколько минут, не могли бы вы проверить @BarbarosÖzhan, пожалуйста?

Mahesh Gopalan 30.08.2024 13:48

дополнительный вопрос опубликован здесь - stackoverflow.com/questions/78932029/…

Mahesh Gopalan 30.08.2024 14:40

Другие вопросы по теме