首页 > 解决方案 > 在 Mule 中使用 Dataweave 读取数组值

问题描述

我正在尝试在 Mule 中使用 dataweave 从传入的有效负载中读取特定的数据值。我的示例有效载荷如下所示:

 {
    "source": [
        {
            "uri": "entities/1R6xV",
            "createdBy": "API_USER",
            "createdTime": 1562504739146,
            "attributes": {
                "label": "000000000002659654",
                "value": {
                    "Name": [
                        {
                        }
                    ],
                    "Id": [
                        {
                        }
                    ],
                    "Number": [
                        {
                            "type": "config/Types/Number/attributes/Number",
                            "ov": true,
                            "value": "000000000002659654",
                            "uri": "entities/1R6xV/attributes/Num/1ZtyT/Number/60pvN6"
                        }
                    ]
                }
            }
        }
    ]
}

如果我需要阅读“标签”,我可以通过

label: payload.source.attributes.label

同样,如何读取属性>数字下的“值”。它不起作用:

Value: payload.source.attributes.Number.value

我是 Dataweave 的新手。请指教。

标签: jsonmulemule-componentdataweavemule-esb

解决方案


问题是点选择器 (.) 适用于对象和对象数组。当它应用于数组时,它将点选择器应用于数组中所有类型为 object 的元素并返回该结果。

让我们一步一步来

payload.source

退货

[
  {
    "uri": "entities/1R6xV",
    "createdBy": "API_USER",
    "createdTime": 1562504739146,
    "attributes": {
      "label": "000000000002659654",
      "value": {
        "Name": [
          {

          }
        ],
        "Id": [
          {

          }
        ],
        "Number": [
          {
            "type": "config/Types/Number/attributes/Number",
            "ov": true,
            "value": "000000000002659654",
            "uri": "entities/1R6xV/attributes/Num/1ZtyT/Number/60pvN6"
          }
        ]
      }
    }
  }
]

到目前为止,payload 是一个 Object,它返回 source 的值,它是一个数组

payload.source.attributes

退货

[
  {
    "label": "000000000002659654",
    "value": {
      "Name": [
        {

        }
      ],
      "Id": [
        {

        }
      ],
      "Number": [
        {
          "type": "config/Types/Number/attributes/Number",
          "ov": true,
          "value": "000000000002659654",
          "uri": "entities/1R6xV/attributes/Num/1ZtyT/Number/60pvN6"
        }
      ]
    }
  }
]

工作正常,因为payload.source的结果以对象数组结束,因此它将对这些对象进行选择。

现在当你执行

payload.source.attributes.value.Number

它返回

[
  [
    {
      "type": "config/Types/Number/attributes/Number",
      "ov": true,
      "value": "000000000002659654",
      "uri": "entities/1R6xV/attributes/Num/1ZtyT/Number/60pvN6"
    }
  ]
]

那是一个数组数组,这里是它被破坏的地方。

我的解决方案

你有两种选择

  • 使用展平功能

    展平(有效载荷.source.attributes.value.Number).value

  • 使用后代选择器

    payload.source.attributes.value.Number..value


推荐阅读