【问题标题】:How to re-arrange the payload1 with the corresponding values of payload2如何使用有效载荷 2 的相应值重新排列有效载荷 1
【发布时间】:2022-01-11 12:29:22
【问题描述】:

我是 Mule 的新手,正在为一个场景苦苦挣扎。

Payload1 是从 csv 文件中检索的,payload2 是传入的有效负载; Payload2 可能有多个对象。输出字段需要根据payload1(即csv格式)和payload2的对应值进行排列。比较需要全部小写。

payload1 = "Name,Roll Number,Standard,Name of School,Address,Marks in Maths"   //this is an input from a csv file

//below is the input from different payload which is in camelcase.
payload2 = [
  {
    "address": "Street 123",
    "standard": "IV",
    "marksInMaths": "90",
    "rollNumber": "5",
    "name": "XYZ",
    "nameofSchool": "Best School"
}]

需要的输出:

[{
   "Name" : "XYZ",
   "Roll Number": "5",
   "Standard" : "IV",
   "Name of School": "Best School", 
   "Address": "Street 123",
   "Marks in Maths": "90"
}]

我怎样才能做到这一点?

【问题讨论】:

  • 我在尝试将 CSV 上的名称与 payload2 对象中的名称匹配时发现了一些问题。例如,Name of School 很容易转换为 nameofSchool。但是要将Marks in Maths 转换为marksInMaths,逻辑是不同的(除非是拼写错误)。如果是这种情况,您需要在某处获取有关名称映射的元数据。
  • 嗨@JorgeGarcia 是的,这就是问题所在;这就是为什么我们需要将两者都转换为所有小写然后进行比较,只有这样它才会起作用
  • 哦,我知道了。谢谢!

标签: dataweave mulesoft mule4


【解决方案1】:

除了映射之外,您还需要注意阅读 CSV 的方式。如果您不禁用 CSV 阅读器中的标头(读取操作上的 mime 类型属性),则有效负载将是一个空集合(因为您有一个没有对象的对象集合,只是字段名称作为元数据)。另一种选择是将 CSV 读取为纯文本/文本,然后使用 splitBy 函数获取名称数组。

%dw 2.0
output application/json

// Be aware that I disable the headers to get them as values. If not it is not possible with CSV. Another way is to read it as text and then use splitBy
var payload1 = read("Name,Roll Number,Standard,Name of School,Address,Marks in Maths", "application/csv", {header: false})

var payload2 = [
  {
    "address": "Street 123",
    "standard": "IV",
    "marksInMaths": "90",
    "rollNumber": "5",
    "name": "XYZ",
    "nameofSchool": "Best School"
}]

// remove spaces and apply lowercase
fun normalize(value:String) = lower(dw::core::Strings::remove(value," "))
fun normalize(value:Object) = 
    value mapObject ((value, key, index) -> {(normalize(key)): value})


var namesMap = payload1[0] mapObject (value, key, index) -> 
    (normalize(value)): value
---

payload2 map ((item, index) -> 
    do {
        var normalizedItem = normalize(item)
        ---
        // iterate the namesMap to get the right order
        namesMap mapObject ((value, key, index) -> 
            // get the key from the namesMap and look the value in the payload2's item
            (value): normalizedItem[key]
        )
    }

神奇的是在映射之前创建 namesMap,这样就可以很容易地创建映射。

编辑:原始代码错误。它只匹配单个字符串键。

【讨论】:

  • 嗨@豪尔赫·加西亚;谢谢您的答复;但是,我得到 null 作为输出中某些值的值;[ { "Name": "XYZ", "Roll Number": null, "Standard": "IV", "Name of School": null, "Address" : "Street 123", "数学分数": null } ]
  • 我只是添加了小写payload2键的大小写:- var lower_payload2 = payload2 map ((value, key) -> value mapObject ( lower ($$ )) : $ )。并且在正文中使用了 lower_payload2 而不是 payload2。它奏效了。十分感谢你的帮助;它奏效了。
  • camelize() 如果我们用下划线替换空格,可能会有用。
  • 感谢@Mule-Newbie 的提醒。我更正了代码,现在应该可以正常工作了。
猜你喜欢
  • 2020-04-26
  • 1970-01-01
  • 2023-01-05
  • 2011-10-01
  • 2016-03-04
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 2020-04-21
相关资源
最近更新 更多