复杂对象数组的数据编织

问题描述 投票:0回答:1
  {
    "customer": [
        {
            "account":{
                "number": 12345,
                "serno": 4000,
                "card": {
                    "id": "a",
                    "number": "a***"
                }
            }
        },
         {
             "account":[
                {
                "number": 33333,
                "serno": 1000,
                "card": {
                        "id": "a",
                        "number": "a***"
                    }
                },
                {
                "number": 22222,
                "serno": 2000,
                "card": [
                    {
                        "id": "a",
                        "number": "b***"
                    },
                    {
                        "id": "a",
                        "number": "c***"
                    },
                    {
                        "id": "a",
                        "number": "d***"
                    }
                    ]
                }
            ]
        }
    ]
}

脚本

%dw 2.0
    output application/json
    var itemsArr = flatten(payload.customer map ((item) -> item.account.number)) 
    var reducedItems = itemsArr reduce ((item, acc) -> item ++ "," ++ acc)
    var foundItem = (flatten(payload.customer.account) filter((item) -> item.number == 22222)) 
    var obValues = [
    {
        "number" : 22222,
        "val": 113
    },
       {
        "number" : 33333,
        "val": 20
    },
       {
        "number" : 12345,
        "val": 30
    },
    ]
    ---
    flatten(payload.customer.account) map ((item) ->
      obValues map ((ob) ->
            if(item.number == ob.number)
                item update {
                    case .serno -> 54435325345
                } else 0)
            
        
    )

我尝试了上述方法但没有成功,它非常接近我需要的数据,但我最终希望更新有效负载中每个“帐户”对象上的“serno”属性,如果“帐户”。“数字”是发现位于 obValues 数组中。 “serno”属性应该是来自与“ob”.“number”匹配的相关 obValue 对象的“val”。任何帮助我指明正确方向的帮助将不胜感激。

  flatten(payload.customer.account) map ((item) ->
      obValues map ((ob) ->
            if(item.number == ob.number)
                item update {
                    case .serno -> 54435325345
                } else 0)
            
        
    )

但是,这会在有效负载响应中放置额外的 0

dataweave mulesoft anypoint-studio
1个回答
0
投票

首先要准确理解您想要实现的输出是什么,并有示例来验证它是否正确,这一点很重要。一旦您能用文字表达出来,您就可以将其翻译成 DataWeave 表达式。此外,您还应该熟悉该语言才能使用正确的功能。脚本应该传达您想要做的事情的意图,以便读者清楚地了解。

问题中的预期输出并不完全清楚。根据我的理解,我开始更新客户数组中的值。为此,您可以使用 update 运算符,它可以简化仅修改我们感兴趣的键的操作。然后您需要更新每个帐户,但是帐户可以是单个对象或数组,因此我们需要决定在每种情况下做什么。我使用模式匹配来做出决定。为了避免使表达式过于复杂,我们可以将其部分封装在函数中,使其更具可读性。最后,如果函数在 obValues 中找到匹配的数字,则更新 serno 值。在上一场比赛中,如果它是单个对象,我调用更新函数,如果它是数组,我为每个项目调用它。

我的脚本:

%dw 2.0 
output application/json 

var obValues = [ { "number" : 22222, "val": 113 }, { "number" : 33333, "val": 20 }, { "number" : 12345, "val": 30 }, ] 

fun accountInOb(n)=obValues dw::core::Arrays::firstWith(((ob) -> ob.number == n))

fun updateSingleAccount(a)=
    a update {
        case .serno -> accountInOb(a.number) default $
    }

fun updateAccount(a)=
    a.account match {
        case is Array -> $ map (updateSingleAccount($))
        case is Object -> updateSingleAccount($)
    }

--- 
payload update {
    case c at .customer -> c map (updateAccount($))
}

输出:

{
  "customer": [
    {
      "number": 12345,
      "serno": {
        "number": 12345,
        "val": 30
      },
      "card": {
        "id": "a",
        "number": "a***"
      }
    },
    [
      {
        "number": 33333,
        "serno": {
          "number": 33333,
          "val": 20
        },
        "card": {
          "id": "a",
          "number": "a***"
        }
      },
      {
        "number": 22222,
        "serno": {
          "number": 22222,
          "val": 113
        },
        "card": [
          {
            "id": "a",
            "number": "b***"
          },
          {
            "id": "a",
            "number": "c***"
          },
          {
            "id": "a",
            "number": "d***"
          }
        ]
      }
    ]
  ]
}
© www.soinside.com 2019 - 2024. All rights reserved.