Mule JSON - 如何将键值对转换为列表

时间:2016-12-30 20:55:08

标签: json mule dataweave

我有一个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"
   }
}

有什么想法吗?

2 个答案:

答案 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函数),生成一个包含keygroupvalue的对象数组领域。然后我们可以filtergroupBy中间数据结构,并在结尾处将其转换为结果对象的元组(toNiceObject)。

要注意的另一件事是使用pluckmatchparseKeys工作。 pluck通过将给定函数应用于对象中的每个键值对(元组)来获取一个对象并生成一个数组。 match允许我们根据某些条件对给定输入应用不同的转换,在本例中为正则表达式。