2016-12-30 53 views
0

我有以下格式的JSON有效载荷:骡子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

这里是我可以使用Dataweave获得的closet输出,只需要使用MEL或简单的java代码就可以在随后的消息处理器中完成移除其他大括号的格式化。希望能帮助到你!!

输入JSON {
“键”: “VALUE1”, “键:1”: “VALUE2”, “键:2”: “值3”, “垃圾键”:“VALUE4 ”, “部分”: “值5”, “部分: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" 
    } 
    } 
] 
+0

可以使用{()}去除包装对象,如下所示:{(zipValues map {...})} –

0

塞特希有一个有效的解决方案了,但这里是为包含冒号任何键一个通用的解决方案:

%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,groupvalue字段的对象的数组。然后我们可以将filtergroupBy这个中间数据结构,并把它变回结果对象的元组(末尾)(toNiceObject)。

另一件需要注意的是使用pluckmatch使parseKeys工作。 pluck通过将给定函数应用于对象中的每个键值对(元组)来生成一个对象并生成一个数组。 match让我们根据一些标准对给定的输入应用不同的转换,在这种情况下是正则表达式。