我有一个JSON有效负载,其格式:
{"key":"value",
"key:1":"value",
"key:2","value",
"junk key":"value",
"part":"value",
"part:1","value",
"part:2","value"...}
想将其转换为:
{"1":{
"key":"value",
"part":"value"
},
"2": {
"key":"value",
"part":"value"
},
"3": {
"key":"value",
"part":"value"
}
}
有什么想法?
这是我可以使用dataweave获得的壁橱输出,只需使用MEL或简单的Java代码在后续消息处理器中删除其他卷发括号的格式即可。希望它有帮助!
输入JSON {
"键":" value1", "键:1":" value2", "键:2":" value3", "垃圾键":" value4", " part":" value5", "零件:1":" value6", "零件:2":" value7"}
dataweave逻辑:
%dw 1.0
%output application/json
%var keyValues = payload mapObject {
('$$' : $)when ( '$$' matches /key(:d)?/)
}
%var partValues = payload mapObject {
('$$' : $)when ( '$$' matches /part(:d)?/)
}
%var zipValues = (keyValues zip partValues) map {
'$$': {
key: $[0],
part: $[1]
}
}
---
zipValues map {
'$$' : $[0]
}
结果
[
{
"0": {
"key": "value1",
"part": "value5"
}
},
{
"1": {
"key": "value2",
"part": "value6"
}
},
{
"2": {
"key": "value3",
"part": "value7"
}
}
]
Senthil已经有一个工作解决方案,但是这里有一个通用解决方案,用于任何包含结肠的键:
%dw 1.0
%output application/json
%function parseKeys(o) o pluck {
key: $$ replace /(w+)(:w+)?/ with $[1],
group: $$ match {
/(w+):(w+)/ -> $[2],
default -> null
},
value: $
}
%function toNiceObject(tuples) {(tuples map {($.key): $.value})}
---
parseKeys(payload)
filter ($.group != null)
groupBy $.group
mapObject (
'$$': toNiceObject($)
)
我认为最好首先分解键(parseKeys
函数),生成具有key
,group
和value
字段的一系列对象。然后,我们可以filter
和groupBy
中间数据结构,然后将其转回末端的结果对象(toNiceObject
)。
要注意的另一件事是使用pluck
和match
使parseKeys
起作用。Pluck采用一个对象并通过将给定功能应用于对象中的每个键值对(元组)来产生数组。匹配使我们能够根据某些标准将不同的转换应用于给定输入,在这种情况下是正则表达式。