简体   繁体   English

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

[英]Mule Dataweave - Add Nested and Simple attributes

I need to add new attributes (simple and nested) to an existing JSON payload using Dataweave (3.0).我需要使用 Dataweave (3.0) 向现有的 JSON 负载添加新属性(简单和嵌套)。 I'm posting the sample payload below:我在下面发布示例有效负载:

{
  "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
              }
            }
          ]
        }
      }
    }
  ]
}

In the above payload, I need to add a new attribute ("StateCode": "null") to OrgAddr.MainAddr and also a new attribute called "Flag": "Yes", after OrgAddr.在上面的负载中,我需要向 OrgAddr.MainAddr 添加一个新属性 ("StateCode": "null"),并在 OrgAddr 之后添加一个名为 "Flag": "Yes" 的新属性。 I can add the new "Flag" attribute at the end, but how can I modify a nested attribute (OrgAddr).我可以在最后添加新的“Flag”属性,但如何修改嵌套属性 (OrgAddr)。 Please note that I need to add the simple and nested attributes together.请注意,我需要将简单属性和嵌套属性添加在一起。

very intersting use case.非常有趣的用例。 I was able to solve it by creating two helper functions that allows me to update the fields.我能够通过创建两个允许我更新字段的辅助函数来解决它。

%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"
                }
            )
        )
    )
)

The two update function help me traverse the object and update the parts of the tree structure that need to be updated or modified.这两个更新函数帮助我遍历对象并更新树结构中需要更新或修改的部分。

Answer for 2.3 version of DataWeave 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"
         }
    }
}

You can try this :你可以试试这个:

 %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