У меня есть следующий 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 и т. д.
Всегда ли первая запись содержит все ключи? Или у вас есть отдельный список всех ключей?
Привет @HarshankBansal, нет, внутренний ключ в основном обозначает «s» для строки. Это может быть число, список и т. д. Таким образом, это не всегда будет «s».
Привет @aled, нет, первая запись может всегда содержать или не содержать все ключи. Ключи передаются в теле полезной нагрузки, например "abc,pqr,xyz,....,mno,def..".
Вы имеете в виду, что ключи могут быть разными для каждой записи в массиве, и не все они находятся в глобальном расположении полезной нагрузки, а вам нужны все ключи в каждой записи вывода?
@HarshankBansal, пожалуйста, не редактируйте недопустимый JSON OP, чтобы он был действительным, если OP не упомянул, что он сделал эту опечатку при публикации вопроса (даже в этом случае он должен быть тем, кто редактирует).
Вы можете использовать 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" } ]
Хорошо. так что это не всегда «s», но всегда ли это будет один ключ?
Это работает, как и ожидалось! Большое спасибо за ваше решение и помощь.
Всегда ли внутренний ключ будет «s»?