如何使用DataWeave与JSON中的字符串的数据实现预期输出

发布于 2025-02-10 05:59:36 字数 1344 浏览 2 评论 0原文

如何使用Mulesoft的DataWeave语言将输入中的JSON数据转换为XML,如输出所示。

输入

{
    "sponsors":[{
        "SP1": "John Smith",
        "NINO": "SC105012B",
        "INCOME1": 10000,
        "INCOME2":12000,
        "DEPENDENTDETAILS": "No, FirstName, LastName, DateOfBirth, EduStatus, Income; 1, John, Smith, 12/12/84, studying at college or university, yes; 2, williams, Smith, 20/06/84, studying at college or university, No;"
    }]  
}

预期输出

<sponsors>
    <sp1>john smith</sp1>
    <nino>sc15012b</nino>
    <income1>10000</income1>
    <income2>12000</income2>
    <dependentdetails>
        <no>1</no>
        <firstname>john</firstname>
        <lastname>smith</lastname>
        <dateOfBirth>12/12/84</dateOfBirth>
        <EduStatus>studying in college or university<EduStatus/>
        <Income>yes</Income>
        <no>2</no>
        <firstname>williams</firstname>
        <lastname>smith</lastname>
        <dateOfBirth>20/06/84</dateOfBirth>
        <EduStatus>studying in college or university<EduStatus/>
        <Income>No</Income>
    </dependentdetails>
</sponsors>

How to transform json data as shown in input into XML as shown in output using MuleSoft's DataWeave language.

Input

{
    "sponsors":[{
        "SP1": "John Smith",
        "NINO": "SC105012B",
        "INCOME1": 10000,
        "INCOME2":12000,
        "DEPENDENTDETAILS": "No, FirstName, LastName, DateOfBirth, EduStatus, Income; 1, John, Smith, 12/12/84, studying at college or university, yes; 2, williams, Smith, 20/06/84, studying at college or university, No;"
    }]  
}

Expected Output

<sponsors>
    <sp1>john smith</sp1>
    <nino>sc15012b</nino>
    <income1>10000</income1>
    <income2>12000</income2>
    <dependentdetails>
        <no>1</no>
        <firstname>john</firstname>
        <lastname>smith</lastname>
        <dateOfBirth>12/12/84</dateOfBirth>
        <EduStatus>studying in college or university<EduStatus/>
        <Income>yes</Income>
        <no>2</no>
        <firstname>williams</firstname>
        <lastname>smith</lastname>
        <dateOfBirth>20/06/84</dateOfBirth>
        <EduStatus>studying in college or university<EduStatus/>
        <Income>No</Income>
    </dependentdetails>
</sponsors>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

旧情勿念 2025-02-17 05:59:36

DepentEntDetails似乎是;分开的标题和记录,每个字段由隔开。一旦我们按了每个字符分开,我们就可以获取一个字段名称列表和每个记录的值列表,我们可以轻松操纵这些记录。

%dw 2.0
output application/xml
fun recordsToObjects(a)= do {
    var headers=a[0]
    ---
    a[1 to -1] map ($ map ((headers[$]): $) reduce ($++$)) reduce ($++$)
}
---
sponsors: {
    sp1: payload.sponsors[0].SP1,
    nino: payload.sponsors[0].NINO,
    income1: payload.sponsors[0].INCOME1,    
    income2: payload.sponsors[0].INCOME2,    
    dependentdetails:recordsToObjects( (payload.sponsors[0].DEPENDENTDETAILS splitBy  ";") map ($ splitBy "," map trim($)) )
}

DEPENDENTDETAILS seems to be a string of headers and records separated by ; and each field separated by ,. Once we split by each of those characters we can get a list of field names and a list of values for each records that we can manipulate easily.

%dw 2.0
output application/xml
fun recordsToObjects(a)= do {
    var headers=a[0]
    ---
    a[1 to -1] map ($ map ((headers[$]): $) reduce ($++$)) reduce ($++$)
}
---
sponsors: {
    sp1: payload.sponsors[0].SP1,
    nino: payload.sponsors[0].NINO,
    income1: payload.sponsors[0].INCOME1,    
    income2: payload.sponsors[0].INCOME2,    
    dependentdetails:recordsToObjects( (payload.sponsors[0].DEPENDENTDETAILS splitBy  ";") map ($ splitBy "," map trim($)) )
}
幽蝶幻影 2025-02-17 05:59:36

您还有一个可以尝试的选择

%dw 2.0
output application/xml
 
var dependentdetails = payload.sponsors.DEPENDENTDETAILS[0] splitBy  ";" map( $ splitBy  ", ")
var keys=dependentdetails[0]
var dependentXml={(flatten(dependentdetails filter $>0 map (
  $ map ((item, index) -> 
    (keys[index]) : trim(item)
  )
)))}
---
sponsors : payload.sponsors map ($ mapObject ((value, key, index) -> 
if(key as String == "DEPENDENTDETAILS")(key): dependentXml
else (key):value
))

There is one more option that you can try

%dw 2.0
output application/xml
 
var dependentdetails = payload.sponsors.DEPENDENTDETAILS[0] splitBy  ";" map( $ splitBy  ", ")
var keys=dependentdetails[0]
var dependentXml={(flatten(dependentdetails filter $>0 map (
  $ map ((item, index) -> 
    (keys[index]) : trim(item)
  )
)))}
---
sponsors : payload.sponsors map ($ mapObject ((value, key, index) -> 
if(key as String == "DEPENDENTDETAILS")(key): dependentXml
else (key):value
))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文