DataWeave перемещает значение дочернего ключа в родительский ключ

У меня есть следующий JSON в качестве входных данных:

[
    {
        "abc: {
            "s": "123"
        },
        "pqr": {
            "s": "234"
        },
        "xyz": {
            "s": "345"
        }
    },
     {
        "abc: {
            "s": "456"
        },
        "pqr": {
            "s": "567"
        }
    }
]

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

[
    {
        "abc: "123",
        "pqr": "234",
        "xyz": "345"
    },
     {
        "abc: "456",
        "pqr": "567",
        "xyz": null
    }
]

Как я могу добиться этого в муле 4? Пожалуйста, предложите.

Примечание. Ключи объекта JSON являются динамическими. Здесь в образце ввода видны 3 ключа. Но в соответствии с входной полезной нагрузкой из других API может быть больше ключей, например abc, def, pqr, mno, xyz и т. д.

Всегда ли внутренний ключ будет «s»?

Harshank Bansal 11.11.2022 09:49

Всегда ли первая запись содержит все ключи? Или у вас есть отдельный список всех ключей?

aled 11.11.2022 12:36

Привет @HarshankBansal, нет, внутренний ключ в основном обозначает «s» для строки. Это может быть число, список и т. д. Таким образом, это не всегда будет «s».

soumya 11.11.2022 16:10

Привет @aled, нет, первая запись может всегда содержать или не содержать все ключи. Ключи передаются в теле полезной нагрузки, например "abc,pqr,xyz,....,mno,def..".

soumya 11.11.2022 16:13

Вы имеете в виду, что ключи могут быть разными для каждой записи в массиве, и не все они находятся в глобальном расположении полезной нагрузки, а вам нужны все ключи в каждой записи вывода?

aled 11.11.2022 17:23

@HarshankBansal, пожалуйста, не редактируйте недопустимый JSON OP, чтобы он был действительным, если OP не упомянул, что он сделал эту опечатку при публикации вопроса (даже в этом случае он должен быть тем, кто редактирует).

Abdul Aziz Barkat 11.11.2022 18:02
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
0
6
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете использовать mapObject для динамического обновления каждого элемента массива. Если JSON с основным значением всегда имеет одно поле, вы можете получить его, используя его индекс [0].

Чтобы убедиться, что вы получили все ключи в каждом объекте, вам нужно будет сначала получить все ключи и написать сценарий вокруг этого.

%dw 2.0
var allFields = payload flatMap keysOf($) distinctBy ($)
output application/json  
---
payload map ((nestedJson) -> 
    allFields reduce ((field, acc = {}) -> {
        (acc),
        (field): (nestedJson[field])[0]
    })
)

Привет Харшанк, прежде всего, спасибо за ваше решение. Внутренний ключ в основном обозначает «s» для строки. Это может быть число, список и т. д. Таким образом, это не всегда будет 's', что исключает тот факт, что мы не можем сделать '(key): valueWithS.s'. При этом ключ «xyz», присутствующий в первой записи, отсутствует во второй записи ввода. Итак, во второй записи вывода он должен отображаться как «xyz: null», которого нет в предоставленном вами решении. [ { "abc": "123", "pqr": "234", "xyz": "345" }, { "abc": "456", "pqr": "567" } ]

soumya 11.11.2022 16:25

Хорошо. так что это не всегда «s», но всегда ли это будет один ключ?

Harshank Bansal 11.11.2022 21:59

Это работает, как и ожидалось! Большое спасибо за ваше решение и помощь.

soumya 14.11.2022 16:55

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