如何在 Mulesoft 中使用 Dataweave 将字符串划分为定义的部分

问题描述

我有一个如下的 JSON 对象

{
 "a" : "ABCDEFGHIJKL","b" : "B"
}

这里每个字段都包含一个字符串(都是不同大小的),我需要将每个字段值(即字符串)除以 4,然后将其作为单独的 JSON 对象数组并将其分配给一个新字段 所以我预期的 o/p 如下

[{
        "label": "a","value": [{
                "Line": "ABCD"
            },{
                "Line": "EFGH"
            },{
                "Line": "IJKL"
            }
        ]
    },{
        "label": "b","value": [{
            "Line": "B"
        }]
    }
]

我正在使用 mule4,我尝试使用 Dataweave 的一些功能但仍然没有运气

解决方法

试试这个!! (更新了我之前忘记放在这里的输入和输出。当时我在上午很早:))

输入

{
 "a": "YHTUJLOKIYTRUYT","b": "ERF","c": "ABCDEFGHIJKLMONP","d": "AVBGTRETYU","e": "ABGTIOU","f": "","g": "E"
}

脚本

%dw 2.0
output application/json
var divideBy=4
fun returnStringParts(val :String,iteration :Number,size :Number) = {
    result:  if((sizeOf(val) - (iteration*size)) > 0 )val  [((iteration -1)*size) to (iteration*size)-1]  else val [(iteration-1)*size to -1]
}
---
payload mapObject  (value,key,index) -> {
    "label": (key),"value" : if (sizeOf(value) > divideBy)  ((1 to (ceil((sizeOf(value)/divideBy )))) map {
        "Line": returnStringParts(value,$,divideBy).result
    }) 
    else
    {
       temp: [{
            "Line": value
        }]
    }.temp
}

输出

{
  "label": "a","value": [
    {
      "Line": "YHTU"
    },{
      "Line": "JLOK"
    },{
      "Line": "IYTR"
    },{
      "Line": "UYT"
    }
  ],"label": "b","value": [
    {
      "Line": "ERF"
    }
  ],"label": "c","value": [
    {
      "Line": "ABCD"
    },{
      "Line": "EFGH"
    },{
      "Line": "IJKL"
    },{
      "Line": "MONP"
    }
  ],"label": "d","value": [
    {
      "Line": "AVBG"
    },{
      "Line": "TRET"
    },{
      "Line": "YU"
    }
  ],"label": "e","value": [
    {
      "Line": "ABGT"
    },{
      "Line": "IOU"
    }
  ],"label": "f","value": [
    {
      "Line": ""
    }
  ],"label": "g","value": [
    {
      "Line": "E"
    }
  ]
}
,

这是一个函数,它可以将一个字符串分成相等的部分以及我使用的一系列测试:

%dw 2.0
output application/dw

var tests = [
    "ABCDEFGHIJKLMNOPSQ","A","ABC","","ABCDEFGH","ABCD"
]
fun eqPartsOf(s: String,p: Number) = s match {
    case "" -> [""]
    else -> do {
        var parts = if ((sizeOf(s) mod p) == 0) (sizeOf(s) / p - 1) else (sizeOf(s) / p)
        ---
        0 to parts map (
            (s[($ * p) to ($ * p + p - 1)]) default (s[($ * p) to -1])
        )       
    }
}

---
tests map (
    $ eqPartsOf 4
)

您现在可以在形成您想要的结果时使用它。

,

这种方法可能类似于 George,您需要根据所需的长度和字符串的大小将字符串分解为相等的部分。使用 pluck 生成数组并映射以遍历生成的部分数量。

%dw 2.0
output application/json

var payload = {
 "a" : "ABCDEFGHIJKL","b" : "B"
}

var length = 4

---
payload pluck (value,key) -> 
    using (totalLength = sizeOf(value),arrayMaxCount =  if (totalLength >= length) ceil((totalLength / length) - 1)
                            else 0
    )
    {
        "label" : key,"value" : (0 to arrayMaxCount) map (innerValue) -> 
        using ( innerMinIndex = innerValue * length,innerMaxIndex  = if (totalLength - (innerMinIndex + length - 1) >= 0) innerMinIndex + length - 1
                                 else totalLength - 1
        )
        {
            "Line" : value[innerMinIndex to innerMaxIndex]
        }
    }

这将导致:

[
  {
    "label": "a","value": [
      {
        "Line": "ABCD"
      },{
        "Line": "EFGH"
      },{
        "Line": "IJKL"
      }
    ]
  },{
    "label": "b","value": [
      {
        "Line": "B"
      }
    ]
  }
]