Почему карта массива Mule DataWeave разделяет объекты верхнего уровня? - PullRequest
4 голосов
/ 05 июля 2019

Я пытаюсь понять поведение DataWeave v1.0, когда дело доходит до сопоставления объектов в корневом массиве JSON.

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

Это моя передача данных:

%dw 1.0
%output application/json
---
payload map {
    ($)
}

Это мой ввод:

[
  {
    "MyString": "ABCD",
    "MyNumber": 123,
    "AnObject": {
       "MyBool": false,
       "MyNestedObject": {
            "MyNestedString": "DEF"
       }
    }
  }
]

Я хочу, чтобы мойвывод должен быть (на данном этапе) точно таким же, как мой ввод.

Вместо этого мой ( неправильный ) вывод:

[
  {
    "MyString": "ABCD",
    "MyNumber": 123,
    "MyBool": false,
    "MyNestedObject": {
      "MyNestedString": "DEF"
    }
  }
]

Как видите, объект AnObject отсутствует, хотя его дочерние элементы остаются.

Все хуже, если вход содержит массивы, например, вход:

[
  {
    "MyString": "ABCD",
    "MyNumber": 123,
    "AnObject": {
       "MyBool": false,
       "MyNestedObject": {
            "MyNestedString": "DEF"
       }
    },
    "AnArray": [
        {
            "Title": "An array item",
            "Description": "Pretty standard"
        }
    ]
  }
]

Выдает ошибку:

Cannot coerce a :array to a :object.

Я поиграл с mapObject Операция над элементами корневого массива тоже, но я всегда сталкиваюсь с тем же поведением.Может ли кто-нибудь объяснить, что здесь происходит, и показать мне, как я могу динамически копировать каждый элемент в корневой полезной нагрузке?

Время выполнения Mule - 3.9.1.

1 Ответ

1 голос
/ 05 июля 2019

Чтобы просмотреть каждый элемент в массиве и оставить все как есть, вы должны сделать payload map $, то же самое, что и payload map ((item) -> item)

То, что вы делали, было таким же, как: payload map ((item) -> {(item)}).

Здесь вы возвращаете для каждого элемента выражение {(expr)}, которое в версии DW, работающей на Mule 3.9.1, имеет случайное поведение, когда выражение пытается привести expr (что в данном случае объект) в массив объектов, а затем он попытается сгладить все объекты в этом принудительном массиве внутри родительского объекта. Похоже, что он пытается принудительно ввести значение ключей, поэтому DW выдает ошибку.

Это поведение {()} изменяется в более новых версиях DW.

...