Mulesoft Dataweave 使用映射来更新对象或使用更新函数或更新运算符

问题描述 投票:0回答:1

我必须根据变量“id”更新 JSON 对象中的值。因此,在下一个 JSON 数组中,当 id = "746936" 时,该 JSON 对象的 isSendstatus 属性必须设置为 true。

这是我的输入

var xyz = [
  {
    "referenceId": "WRK-2403472",
    "taskReferenceId": "440827",
    "textMessages": [
      {
        "id": "746935",
        "isSendStatus": false,
        "message": "test1"
      },
      {
        "id": "746936",
        "isSendStatus": false,
        "message": "test2"
      }
    ]
  },
  {
    "referenceId": "WRK-2403470",
    "taskReferenceId": "440828",
    "textMessages": [
      {
        "id": "746935",
        "isSendStatus": false,
        "message": "test3"
      }
    ]
  }
]

当我制作地图并使用此代码再次重建 JSON 时,它就可以正常运行。

xyz map (item,index) -> {
    (referenceId : item.referenceId) if (item.referenceId != null),
    (taskReferenceId: item.taskReferenceId) if (item.taskReferenceId != null),
    (textMessages: item.textMessages map {
        id: $.id,
        isSendStatus: if(($.id == "746936") and (item.taskReferenceId == "440827")) true else  $.isSendStatus,
        message: $.message
    }) if (item.textMessages != null)
}

这是正确的输出:

[
  {
    "referenceId": "WRK-2403472",
    "taskReferenceId": "440827",
    "textMessages": [
      {
        "id": "746935",
        "isSendStatus": false,
        "message": "test1"
      },
      {
        "id": "746936",
        "isSendStatus": true,
        "message": "test2"
      }
    ]
  },
  {
    "referenceId": "WRK-2403470",
    "taskReferenceId": "440828",
    "textMessages": [
      {
        "id": "746935",
        "isSendStatus": false,
        "message": "test3"
      }
    ]
  }
]

但是代码很多,而且 Mulesoft 也有更新运算符和函数,我尝试了一些类似的方法,但没有一个给出正确的结果:

// attempt 1
xyz map ($ update {
    case .textMessages["746936"].isSendStatus -> true
})

// attempt 2
xyz map(item,index) -> (item update ["textMessages"] with (if ($.id == "746936") 
        {
        id: $.id, 
        isSendStatus: true, 
        message: $.message
        } 
        else 
        $
    )
)

但是当使用更新运算符或函数时它不起作用。我认为问题在于更新函数或运算符对数组有问题。

arrays json dataweave mulesoft
1个回答
0
投票

我不会说这是很多代码。使用更新运算符可能不会减少代码的大小,但对于维护来说也许更重要的是,您可以进行更改以更好地传达代码的意图。

您可以使用filterObject()来删除所有具有空值的键,而不是对每个键进行空值检查。

用更新运算符替换剩余条件可能被认为是风格问题,但它允许您仅映射需要更改的字段。

%dw 2.0
output application/json 
---
payload map (item,index) -> 
    item filterObject ((value, key, index) -> !(value is Null)) // remove all keys that have a null value
    update {
        case textMessages at .textMessages -> // update textMessages
            textMessages map ((message) -> message update { // update each item in textMessages
                    case status at .isSendStatus -> if((message.id == "746936") and (item.taskReferenceId == "440827")) true else status // update only the 
                })
    }

为了测试,我添加了一个具有空值的项目。

输入示例:

[
  {
    "referenceId": "WRK-2403472",
    "taskReferenceId": "440827",
    "textMessages": [
      {
        "id": "746935",
        "isSendStatus": false,
        "message": "test1"
      },
      {
        "id": "746936",
        "isSendStatus": false,
        "message": "test2"
      }
    ]
  },
  {
    "referenceId": "WRK-2403470",
    "taskReferenceId": "440828",
    "textMessages": [
      {
        "id": "746935",
        "isSendStatus": false,
        "message": "test3"
      }
    ]
  },
 {
    "referenceId": null,
    "taskReferenceId": "440828",
    "textMessages": null
  }
]

输出:

[
  {
    "referenceId": "WRK-2403472",
    "taskReferenceId": "440827",
    "textMessages": [
      {
        "id": "746935",
        "isSendStatus": false,
        "message": "test1"
      },
      {
        "id": "746936",
        "isSendStatus": true,
        "message": "test2"
      }
    ]
  },
  {
    "referenceId": "WRK-2403470",
    "taskReferenceId": "440828",
    "textMessages": [
      {
        "id": "746935",
        "isSendStatus": false,
        "message": "test3"
      }
    ]
  },
  {
    "taskReferenceId": "440828"
  }
]
© www.soinside.com 2019 - 2024. All rights reserved.