繁体   English   中英

Mule Dataweave - 添加嵌套和简单属性

[英]Mule Dataweave - Add Nested and Simple attributes

我需要使用 Dataweave (3.0) 向现有的 JSON 负载添加新属性(简单和嵌套)。 我在下面发布示例有效负载:

{
  "entities": [
    {
      "ID": "ABC",
      "sourceEnt": {
        "entityId": "100A",
        "entity": {
          "Code": "AB",
          "Idf1": "1pwe",
          "Idf2": null,
          "OrgAddr": [
            {
              "OrgAddrIdf1": "1pwe1",
              "Rank": 1,
              "Label": "One",
              "MainAddr": {
                "AddrLine1": "abc",
                "PoBox": 123,
                "DistrictCode": null
              }
            },
            {
              "OrgAddrIdf1": "1pwe2",
              "Rank": 2,
              "Label": "Two",
              "MainAddr": {
                "AddrLine1": "xyz",
                "PoBox": 456,
                "DistrictCode": null
              }
            }
          ]
        }
      }
    }
  ]
}

在上面的负载中,我需要向 OrgAddr.MainAddr 添加一个新属性 ("StateCode": "null"),并在 OrgAddr 之后添加一个名为 "Flag": "Yes" 的新属性。 我可以在最后添加新的“Flag”属性,但如何修改嵌套属性 (OrgAddr)。 请注意,我需要将简单属性和嵌套属性添加在一起。

非常有趣的用例。 我能够通过创建两个允许我更新字段的辅助函数来解决它。

%dw 2.0
output application/json

/**
 * Updates the value of the specified field If the field doesn't exits it will be inserted at the bottom. Use this function with `with`. The with will receive the old value
 */
fun update(objectValue: Object, fieldName: String) = 
    (newValueProvider: (oldValue: Any, index: Number) -> Any) -> do {
        if(objectValue[fieldName]?)
            objectValue mapObject ((value, key, index) -> 
                if(key ~= fieldName)
                    {(key): newValueProvider(value, index)}
                else
                {(key): value}
            )
        else
            objectValue ++ {(fieldName): newValueProvider(null, 0)}
    }

/**
 * Updates the value at the specified index. If the index is bigger than the size it will be appended. Use this function with `with`. The with will receive the old value
 */
fun update(arrayValue: Array, indexToUpdate: Number) = 
    (newValueProvider: (oldValue: Any, index: Number) -> Any) -> do {
        if(arrayValue[indexToUpdate]?)
            arrayValue map ((value, index) -> 
                if(index == indexToUpdate)
                    newValueProvider(value, index)
                else
                    value
            )
        else
            arrayValue << newValueProvider(null, 0)
    }

---
payload update "entities" with (
    $ update 0 with (
        $ update "sourceEnt" with (
            $ update "entity" with (
                $ update "OrgAddr" with (
                        $ map ((item, index) -> item update "MainAddr" with ($ ++ {"StateCode": null}) )
                ) ++ {
                    "Flag" : "yes"
                }
            )
        )
    )
)

这两个更新函数帮助我遍历对象并更新树结构中需要更新或修改的部分。

2.3 版 DataWeave 的答案

payload update {
    case entity at.entities[0].sourceEnt.entity -> do {
         entity update {
            case addresses at .OrgAddr ->  do {
            addresses map ((addr, index) -> addr  update {
                    case .MainAddr.StateCode! ->  null
            })
            }
            case .Flag! -> "Yes"
         }
    }
}

你可以试试这个:

 %dw 1.0
    %output application/json
    %var pay=flatten payload.entities.sourceEnt.entity.OrgAddr
    ---
     {(pay)} mapObject {
            ($$):$ when ($$ as :string) != "MainAddr" otherwise {"StateCode": "null"} ++ $
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM