Заменить определенные значения в массиве, используя dwl 1.0 - PullRequest
0 голосов
/ 03 июля 2019

Проблема с правильным использованием функции mapObject. Попытка сохранить существующую структуру массива, но рассчитать количество транспортных средств и свойств и обновить существующий массив, содержащий значение. ОБЩИЕ данные поступают из одного источника, данные АВТОМОБИЛЯ - из другого источника, данные СОБСТВЕННОСТИ - из другого источника. Поэтому при слиянии я должен обновить ОБЩИЕ данные с количеством других исходных данных. Также GENERAL является объектом массива, он всегда будет иметь значение 1. Поэтому использование GENERAL [0] безопасно и хорошо.

Оригинальная полезная нагрузка

[
  {
    "commId": "1",
    "GENERAL": [
      {
        "ID": "G1",
        "VEHICLE_COUNT": "TODO",
        "PROPERTY_COUNT": "TODO"
      }
    ],
    "VEHICLE": [
      {
        "ID": "V1-1"
      },
      {
        "ID": "V1-2"
      }
    ],
    "PROPERTY": [
      {
        "ID": "P1-1"
      }
    ]
  },
  {
    "commId": "2",
    "GENERAL": [
      {
        "ID": "G2",
        "VEHICLE_COUNT": "TODO",
        "PROPERTY_COUNT": "TODO"
      }
    ],
    "VEHICLE": [
      {
        "ID": "V2-1"
      }
    ],
    "PROPERTY": [
      {
        "ID": "P2-1"
      },
      {
        "ID": "P2-2"
      }
    ]
  },
  {
    "commId": "3",
    "GENERAL": [
      {
        "ID": "G3",
        "VEHICLE_COUNT": "TODO",
        "PROPERTY_COUNT": "TODO"
      }
    ],
    "VEHICLE": [
      {
        "ID": "V3-1"
      },
      {
        "ID": "V3-2"
      },
      {
        "ID": "V3-3"
      }
    ]
  }
]

Попытался использовать map для циклического перебора полезной нагрузки и попытался изменить атрибут 2, но сумел отобразить только один, но даже это показывает неправильный вывод.

test map (item, index) -> {
    (item.GENERAL[0] mapObject (value, key) -> { 
        (key): (value == sizeOf (item.VEHICLE)
                when (key as :string) == "VEHICLE_COUNT" 
                otherwise value)
    })
}

Ожидаемый результат:

[
  {
    "commId": "1",
    "GENERAL": [
      {
        "ID": "G1",
        "VEHICLE_COUNT": "2",
        "PROPERTY_COUNT": "1"
      }
    ],
    "VEHICLE": [
      {
        "ID": "V1-1"
      },
      {
        "ID": "V1-2"
      }
    ],
    "PROPERTY": [
      {
        "ID": "P1-1"
      }
    ]
  },
  {
    "commId": "2",
    "GENERAL": [
      {
        "ID": "G2",
        "VEHICLE_COUNT": "1",
        "PROPERTY_COUNT": "2"
      }
    ],
    "VEHICLE": [
      {
        "ID": "V2-1"
      }
    ],
    "PROPERTY": [
      {
        "ID": "P2-1"
      },
      {
        "ID": "P2-2"
      }
    ]
  },
  {
    "commId": "3",
    "GENERAL": [
      {
        "ID": "G3",
        "VEHICLE_COUNT": "3",
        "PROPERTY_COUNT": "0"
      }
    ],
    "VEHICLE": [
      {
        "ID": "V3-1"
      },
      {
        "ID": "V3-2"
      },
      {
        "ID": "V3-3"
      }
    ]
  }
]

Получаем совершенно неверный вывод:

[
  {
    "ID": "G1",
    "VEHICLE_COUNT": false,
    "PROPERTY_COUNT": "TODO"
  },
  {
    "ID": "G2",
    "VEHICLE_COUNT": false,
    "PROPERTY_COUNT": "TODO"
  },
  {
    "ID": "G3",
    "VEHICLE_COUNT": false,
    "PROPERTY_COUNT": "TODO"
  }
]

1 Ответ

0 голосов
/ 03 июля 2019

Отредактировано: обновление для динамического преобразования

Приведенное ниже преобразование данных не очень привлекательно, но может сработать для вас.

Спасибо Кристиану Чибане за помощь в поиске динамичного ответа, ответив на этот вопрос: Почему карта массива Mule DataWeave отбрасывает объекты верхнего уровня?

%dw 1.0
%output application/json
---
payload map ((item) -> 
    (item - "GENERAL") ++
    GENERAL: item.GENERAL map (
        $ - "VEHICLE_COUNT"
          - "PROPERTY_COUNT"
          ++ { VEHICLE_COUNT: sizeOf (item.VEHICLE default []) }
          ++ { PROPERTY_COUNT: sizeOf (item.PROPERTY default []) }
    )
)

Он динамический, поэтому все должно быть скопировано по мере поступления, только с двумя полями, которые вы хотите обновить.

Выход для этого преобразования с введенным вами входом приведен ниже. Единственное отличие от желаемого заключается в том, что значения отображаются в виде чисел, а не строк. Если вам действительно нужны они как строки, вы можете разыграть их как (sizeOf (comm.VEHICLE default [])) as :string,

[
  {
    "commId": "1",
    "VEHICLE": [
      {
        "ID": "V1-1"
      },
      {
        "ID": "V1-2"
      }
    ],
    "PROPERTY": [
      {
        "ID": "P1-1"
      }
    ],
    "GENERAL": [
      {
        "ID": "G1",
        "VEHICLE_COUNT": 2,
        "PROPERTY_COUNT": 1
      }
    ]
  },
  {
    "commId": "2",
    "VEHICLE": [
      {
        "ID": "V2-1"
      }
    ],
    "PROPERTY": [
      {
        "ID": "P2-1"
      },
      {
        "ID": "P2-2"
      }
    ],
    "GENERAL": [
      {
        "ID": "G2",
        "VEHICLE_COUNT": 1,
        "PROPERTY_COUNT": 2
      }
    ]
  },
  {
    "commId": "3",
    "VEHICLE": [
      {
        "ID": "V3-1"
      },
      {
        "ID": "V3-2"
      },
      {
        "ID": "V3-3"
      }
    ],
    "GENERAL": [
      {
        "ID": "G3",
        "VEHICLE_COUNT": 3,
        "PROPERTY_COUNT": 0
      }
    ]
  }
]
...