【问题标题】:How to declare a local variable in mule3如何在 mule 3 中声明局部变量
【发布时间】:2022-02-17 04:36:43
【问题描述】:

我正在 Mule 3 中进行数据转换。我正在更新现有代码,其中在 DataWeave 1.0 中声明了许多变量

我想在声明的变量中添加一个名为“type__c”的字段。

我的输入载荷如下

{
  "billofPlaning": {
    "billcollection": {
      "itemDetail": [
        {
          "comm": [
            {
              "commodity": {
                "itemSequence": 1,
                "equipmentPrefix": "ABCD",
                "equipmentNumber": "1234"
              }
            },
             {
              "commodity": {
                "itemSequence": 2,
                "equipmentPrefix": "DEFG",
                "equipmentNumber": "5678"
              }
            }
          ]
        }
      ]
    },
       "equip": [
      {
        "equipment": {
          "prefix": "ABCD",
          "number": "1234",
          "type": 2345
        }
      },
       {
        "equipment": {
          "prefix": "HIJ",
          "number": "7890",
           "type": 234567
        }
      }
    ]
  }
}

我现有的 DataWeave 1.0 脚本是这样的:

%dw 1.0
%output application/java
%var inputData=payload
%var payBill= inputData.billofPlaning.billcollection.itemDetail default [] map (billcode,indexOfbillcode) -> {
    billcode: {
            "field1": "",
            "type__c": ""
        }
---
paybill

我想在上面的 DataWeave 1.0 代码中为字段“type__c”重用下面的 DataWeave 2.0 代码。

%dw 2.0
output application/json
var test= ((payload.billofPlaning.equip) filter (($.equipment.prefix == payload.billofPlaning.billcollection.itemDetail.comm[0].commodity.equipmentPrefix[0])
and ($.equipment.number == payload.billofPlaning.billcollection.itemDetail.comm[0].commodity.equipmentNumber[0])))
---
"type__c": test.equipment."type"[0]

我们能否使用 DataWeave 1.0 以更好的方式来做这件事(基本上使用任何局部变量或我们在 DataWeave 1.0 中声明的 payBill 变量中的某些东西)?

【问题讨论】:

  • DWL 并不是一个标准名称。请改用 DataWeave,以便每个人都能准确理解语言是什么。
  • 到底是什么问题?您在 DataWeave 1.0 和 2.0 中都有脚本,其中包含变量,因此您似乎知道如何使用变量。要求不明确。您如何理解“更清洁的方式”?您对回应的期望是什么?
  • 除了 type__c 之外,DataWeave 1.0 脚本是否应该工作?
  • @aled,我知道如何使用变量,但不确定如何在 dwl 1.0 的已声明变量 payBill 中声明局部变量。我已经通过添加“”为type__c编辑了dwl 1.0
  • @aled,(将 dwl 的名称更正为 Dataweave)我想将 Dataweave 1.0 中的 Dataweave 2.0 代码合并为 type__c 字段,我想在 Dataweave 1.0 代码支付单中使用 Dataweave2.0 测试变量变量然后想将值赋给 type__c ,

标签: mule dataweave mule4


【解决方案1】:

目前尚不清楚您的转换逻辑是什么以及预期的结果是什么。如果您只想重用test 变量,那么DataWeave 1 和DataWeave 2 之间特定变量的唯一区别在于前者的变量声明使用% 字符。我将它添加到脚本中并删除了无用的 inputData 变量。我还修复了缺少结束大括号的脚本。

%dw 1.0
%output application/java
%var test= ((payload.billofPlaning.equip) filter (($.equipment.prefix == payload.billofPlaning.billcollection.itemDetail.comm[0].commodity.equipmentPrefix[0])
and ($.equipment.number == payload.billofPlaning.billcollection.itemDetail.comm[0].commodity.equipmentNumber[0])))        

%var payBill=(payload.billofPlaning.billcollection.itemDetail default []) 
        map (billcode,indexOfbillcode) -> {
          billcode: {
            "field1": "",
            "type__c":  test
          }
        }
---
payBill

输出:

[{billcode={field1=, type__c=[{equipment={prefix=ABCD, number=1234, type=2345}}]}}]

如果您想定义一个“本地”变量,您可以使用using 语法来声明scoped variables。我看不出在这个特定的脚本中这有什么意义。通常它用于简化对嵌套项的访问,此脚本不使用。

例子:

%dw 1.0
%output application/java
%var payBill=(payload.billofPlaning.billcollection.itemDetail default []) 
        map (billcode,indexOfbillcode) -> 
          using ( test= ((payload.billofPlaning.equip) filter (($.equipment.prefix == payload.billofPlaning.billcollection.itemDetail.comm[0].commodity.equipmentPrefix[0])
and ($.equipment.number == payload.billofPlaning.billcollection.itemDetail.comm[0].commodity.equipmentNumber[0])))    )        

          {
            billcode: {
              "field1": "",
              "type__c":  test
            }
          }
---
payBill

我不会称之为改进。

DataWeave 2.0 中的等效项是 do 命令,它具有改进的功能和更好的语法。

【讨论】:

  • 谢谢,Alex 我已经完成了,但我正在寻找另一种方法来将 paybill 变量中的测试变量声明为局部变量。我们可以这样做吗?
  • 是的,但我不认为它对这种情况有用。我更新了我的答案。
  • 非常感谢@aled,我只是在寻找这个功能,但我只专注于 do()。
猜你喜欢
  • 2011-09-29
  • 2011-03-10
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
相关资源
最近更新 更多