json - 使用 Dataweave 2.0 将 JSON 对象展开为嵌套的 JSON 对象

标签 json mule dataweave mulesoft

我有这个扁平化对象

{
  "abc.def.ghi": "foo",
  "abc.def.jkl": "bar"
}

我想写一个dataweave把它转换成原来的对象,即

{
  "abc": {
    "def": {
      "ghi": "foo",
      "jkl": "bar"
    }
  }
}

我试图避免对键进行硬编码,因为它是一个相当大的对象,所以我不想要这样的东西:

%dw 2.0
var test = {
    "abc.def.ghi": "foo",
    "abc.def.jkl": "bar"
}
output application/json
---
{
    abc: {
        def: {
            ghi: test."abc.def.ghi",
            jkl: test."abc.def.jkl"
        }
    }
}

我可以使用一些可用的 dataweave 函数组合来实现这一目标吗?

到目前为止,这是我尝试过的:

%dw 2.0
var test = {
    "abc.def.ghi": "foo",
    "abc.def.jkl": "bar"
}
output application/json
---
test mapObject ((value, key) -> 
    (key as String splitBy  ".")[-1 to 0]  
         reduce ((item, acc = value) -> 
             (item): acc     
/*
   First item=ghi,acc=foo => acc = {ghi: "foo"} 
   next item=def, acc={ghi: "foo"} => acc={def:{ghi:"foo"}}
*/
    )
)

但这会生成某种独立的嵌套 JSON 对。以下是上述代码的输出:

{
  "abc": {
    "def": {
      "ghi": "foo"
    }
  },
  "abc": {
    "def": {
      "jkl": "bar"
    }
  }
}

最佳答案

您可以尝试以下 dataweave 表达式,该表达式基于 Mohammad Mazhar Ansari 撰写的这篇 Apisero 文章:https://apisero.com/property-to-yaml-file-conversion-using-mulesoft/

%dw 2.0
var test = {
    "abc.def.ghi": "foo",
    "abc.def.jkl": "bar"
}
import * from dw::core::Strings
output application/json
fun generateArray (obj) = obj pluck (v, k) -> (k): v
fun isSubChildExists (key) = (((key) splitBy ("."))[1] != null)
fun propToJSON(key, value) = if (isSubChildExists(key)) {
   (substringBefore(key, ".")) : propToJSON(substringAfter(key, "."), value)
}
else
   (key): value
fun arrToObj(arr) = arr reduce ((env, obj={}) -> obj ++ env)
fun CombineObjBasedOnKey (Obj) =
if (typeOf(Obj) == Array and sizeOf(Obj..) > 1)
((Obj groupBy (item, index) -> keysOf(item)[0]) mapObject ((value, key, index) ->
   (if (typeOf(value) == Array)
       (key): CombineObjBasedOnKey(value..'$key')
   else if (typeOf(value) == String)
       value
   else
       (key): value
) as Object))
else
   Obj[0]
---
CombineObjBasedOnKey(generateArray(test) map ((item, index) -> item mapObject ((value, key, index) -> propToJSON((key), value))
))

输出:

{
  "abc": {
    "def": {
      "ghi": "foo",
      "jkl": "bar"
    }
  }
}

关于json - 使用 Dataweave 2.0 将 JSON 对象展开为嵌套的 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63789863/

相关文章:

javascript - 如何从数组的数组中选择

ruby-on-rails - 你如何在 JBuilder 中渲染散列值的部分?

mule - 在 Mule 应用程序中实现条件循环

mule - 使用 Mule 4 在一封电子邮件中动态附加多个 csv 文件

java - 如何将字符串添加到转换消息组件中的 Java 列表?

dataweave - 从 CloudHub Mulesoft 获取 excel 文件

java - 我应该使用什么java数据结构来对这些数据进行排序?

javascript - 使用 Javascript 转换 JSON 日期

mule - 如何加载 Mule XML 配置

mule - DataWeave 组件中的条件检查