2016-12-30 49 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讓我們根據一些標準對給定的輸入應用不同的轉換,在這種情況下是正則表達式。