【问题标题】:Is there a way to create more flexible loops with Dataweave maps?有没有办法使用 Dataweave 地图创建更灵活的循环?
【发布时间】:2018-05-10 01:11:30
【问题描述】:

我有一个问题,用任何其他语言都需要十秒钟,但在这里我无法使用 Dataweave 解决它。

我的 JSON 看起来像这样:

{
    "100": [{
        "courseID": "100",
        "course": "physics",
        "instructor": "John S",
        "section": "A",
        "date": "01-01-1900"
    }],
    "200": [{
        "courseID": "200",
        "course": "math",
        "instructor": "Jim R",
        "section": "A",
        "date": "01-03-1900"
    },
    {
        "courseID": "200",
        "course": "math",
        "instructor": "Jim R",
        "section": "B",
        "date": "01-07-1900"
    },
    {
        "courseID": "200",
        "course": "math",
        "instructor": "Jim R",
        "section": "C",
        "date": "01-08-1900"
    }

    ]}
}

我确定数组中的对象包含重复信息,但部分和日期除外。所以我需要把它浓缩转化成这样:

{
    "courses": [{
        "courseID": "100",
        "course": "physics",
        "instructor": "John S",
        "sections": [{
            "section": "A",
            "date": "01-01-1900"
        }]
    },
    {
        "courseID": "200",
        "course": "math",
        "instructor": "Jim R",
        "sections": [{
            "section": "A",
            "date": "01-03-1900"
        },
        {
            "section": "B",
            "date": "01-07-1900"
        },
        {
            "section": "C",
            "date": "01-08-1900"
        }]
]}

我不能让这发生。我已经尝试了所有可以看到的方法来迭代文档,使用 map()、mapObject() 和 pluck()。我认为它们需要嵌套,我只想从它迭代的第一门课程中提取 ID、课程和讲师,然后继续使用部分数据构建对象。嵌套似乎会引起问题,因为对象和数组混合在一起,如果嵌套函数返回错误的类型,则 map() 和 mapObject() 会抱怨。这是我一直在尝试但没有成功的事情:

%dw 2.0
output application/json
---
"courses": payload.pluck(courseValue, courseKey, courseIndex) -> 
               courseValue map (classValue, classKey, classIndex) ->
                   { courseID: classValue.courseID,
                     instructor: classValue.instructor
                     etc...
 }

我希望一切都清楚。我被它弄乱了这么久已经筋疲力尽了。有没有可能我想做的事情对 DW 来说太复杂了,我应该使用另一种方法?

【问题讨论】:

    标签: mule dataweave


    【解决方案1】:

    此解决方案应适用于所有 DataWeave 版本

    courses: (payload pluck $$) map using (c = payload[$]) {
      courseID : $,
      course: c[0].course,
      instructor: c[0].instructor,
      sections: c map {
        section: $.section,
        date: $.date
      }
    }
    

    此解决方案在 Mule 3.x 中有效,但在 4.x 中无效,此博客文章“从对象到数组的自动强制转换”下对此进行了解释:https://blogs.mulesoft.com/dev/mule-dev/dataweave-mule-4-beta-syntax-changes-part-1/

    courses: payload map {
      courseID: $[0].courseID,
      course: $[0].course,
      instructor: $[0].instructor,
      sections: $ map {
        section: $.section,
        date: $.date
      }
    }
    

    【讨论】:

    • 非常感谢您的帮助。不幸的是,这对我不起作用。我收到以下错误:消息:“您使用这些参数调用函数'map':1:对象({“100”:[{courseID:“100”,课程:“物理”,...)2:函数(($:Any, $$:Any) -> ???) 但它需要这些类型的参数: 1:数组 2:函数 我尝试将 map() 更改为 mapObject(),这不会给我一个错误,但只输出输入的最后一门课程。它似乎循环遍历自身并在每次迭代时覆盖输出,导致输出中只有最后一门课程。
    • 您发布的错误消息表明您正在使用 Mule 4.x,因此在对 Mule 4.x 中的更改进行了一些研究后,我添加了一个我希望对您有用的解决方案
    • 所以这种工作,但它只会输出列表中的最后一门课程。有点像循环在每次迭代时覆盖自己的输出。
    【解决方案2】:

    我看到您使用的是 DataWeave 2.0。这是您可以使用的简单 DataWeave 转换器。

    变压器:

            <ee:transform doc:name="Transform Message" >
                <ee:message >
                    <ee:set-payload ><![CDATA[%dw 2.0
    output application/json
    ---
    {
        courses: (payload pluck $$) map ((courseValue, courseKey) -> {
            courseID: payload[courseValue][0].courseID,
            course: payload[courseValue][0].course,
            instructor: payload[courseValue][0].instructor,
            sections: payload[courseValue] map ((sectionValue, sectionKey) -> {
                section: sectionValue.section,
                date: sectionValue.date
            }) 
        })  
    }
    ]]></ee:set-payload>
                </ee:message>
            </ee:transform>
    

    输入:

    {
      "100": [
        {
          "courseID": "100",
          "course": "physics",
          "instructor": "John S",
          "section": "A",
          "date": "01-01-1900"
        }
      ],
      "200": [
        {
          "courseID": "200",
          "course": "math",
          "instructor": "Jim R",
          "section": "A",
          "date": "01-03-1900"
        },
        {
          "courseID": "200",
          "course": "math",
          "instructor": "Jim R",
          "section": "B",
          "date": "01-07-1900"
        },
        {
          "courseID": "200",
          "course": "math",
          "instructor": "Jim R",
          "section": "C",
          "date": "01-08-1900"
        }
      ]
    }
    

    输出:

    {
      "courses": [
        {
          "courseID": "100",
          "course": "physics",
          "instructor": "John S",
          "sections": [
            {
              "section": "A",
              "date": "01-01-1900"
            }
          ]
        },
        {
          "courseID": "200",
          "course": "math",
          "instructor": "Jim R",
          "sections": [
            {
              "section": "A",
              "date": "01-03-1900"
            },
            {
              "section": "B",
              "date": "01-07-1900"
            },
            {
              "section": "C",
              "date": "01-08-1900"
            }
          ]
        }
      ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      相关资源
      最近更新 更多