我有一个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"
}
}
有什么想法吗?
答案 0 :(得分:0)
这是我可以使用Dataweave得到的壁橱输出,只需删除附加花括号的格式化就可以在后续的消息处理器中使用MEL或简单的java代码完成。希望它有所帮助!!
输入JSON
{
"键":"值1&#34 ;,
"键:1":"值2&#34 ;,
"键:2":"值3&#34 ;,
"垃圾密钥":" value4",
"部分":"值5&#34 ;,
"部分:1":" value6&#34 ;,
"部分:2":" value7"
}
Dataweave Logic:
%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"
}
}
]
答案 1 :(得分:0)
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通过将给定函数应用于对象中的每个键值对(元组)来获取一个对象并生成一个数组。 match允许我们根据某些条件对给定输入应用不同的转换,在本例中为正则表达式。