У меня есть 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 ]
} ]
} ]
}
Вы можете лучше справиться с этой проблемой, накапливая внутренние элементы (те, что находятся в массиве "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, кажется, что они сжимаются в массив, а не в отдельную объектную структуру;
Я добавил обновленный раздел и отметил его Edit: . Сообщите мне, правильно ли это было сделано
Барбарос, я только что заметил, что упустил из виду тот факт, что преобразование сохраняет значения, соответствующие Others
первому ProductCharge
объекту. Даже им нужно измениться в связи с ProductCharge
. Таким образом, значения aboveAmount
, chargeType
и т. д. также необходимо будет изменить. Я пытался разобраться в том, как оно устроено, но мне не удалось сделать это правильно.
не уверен, есть ли у вас изменения, чтобы увидеть мой последний комментарий. Я потратил некоторое время, пытаясь заставить преобразование работать Others
и быть динамичным для каждого ProductCharge
, но мне это не удалось. Когда у вас будет несколько минут, не могли бы вы проверить @BarbarosÖzhan, пожалуйста?
дополнительный вопрос опубликован здесь - stackoverflow.com/questions/78932029/…
Добро пожаловать в СО Махеш