微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 dataweave 2.0 将 JSON 数组转换为对象

如何解决使用 dataweave 2.0 将 JSON 数组转换为对象

我的有效负载低于层次结构,并尝试根据列“DeleteIndicator”=“Y”进行过滤。这些是我将得到的固定列。我想遍历有效负载并检查 DeleteIndicator。更新了内部数组中多个孩子的输入和预期输出

输入:

    {
   "Num":4363886,"LineItems":[
      {
         "DetailGUID":"B439E023360C","DeleteIndicator":"Y"
      },{
         "DetailGUID":"B439E023360C","LineQuantity":[
            {
               "AltGUID":"2B43AC4203DC","DeleteIndicator":"Y"
            },{
               "AltGUID":"2B43AC4203DD","DeleteIndicator":"Y"
            }
         ]
      },"ShipTo":[
                  {
                     "ShipToGUID":"2B43AC4201AB","DeleteIndicator":"Y"
                  },{
                     "ShipToGUID":"2B43AC4201AC","DeleteIndicator":"Y"
                  }
               ]
            }
         ]
      }
   ]
}

预期输出

{
   "Num":4363886,"Details":[
      {
         "DetailGUID":"B439E023360C","AltGUID":null,"ShipToGUID":null
      },"AltGUID":"2B43AC4203DC","AltGUID":"2B43AC4203DD","ShipToGUID":"2B43AC4201AB"
      },"ShipToGUID":"2B43AC4201AC"
      }
   ]
}

解决方法

这应该可以完成您的工作。如果您需要任何说明,请告诉我。

    %dw 2.0
output application/json
---
{
Num:payload.Num,Details:payload.LineItems map (v0,k0) ->
{
    DetailGUID:v0..DetailGUID[0],AltGUID:v0..AltGUID[0],ShipToGUID:v0..ShipToGUID[0]
}
}
,

嗯,这有点复杂,但我已尽力使代码可读和记录。 尝试从不同的角度看问题。认为您正试图在所有“LineQuantity”中“传播”“LineItems”的字段。

%dw 2.0

// This Function takes a json and an array and spreads the json fields
// across each elements of the array.
fun spreadAcrossArray(json: Object,array: Array | Null) = (array default [{}]) map {
    (json),($)
}

//Here is the main logic of getting the payload.
//The idea is first to "Spread" the lineItem Elements across all the "LineQuantity" 
//and then spread those to all "ShipTo" elements. 
fun spreadLineItemAcrossLineQuantity(lineItems: Array) = lineItems map ((lineItem) -> do {
     var lineItemSpreadedAcrossQuantity = 
        {DetailGUID: lineItem.DetailGUID} spreadAcrossArray lineItem.LineQuantity
     ---
     flatten(lineItemSpreadedAcrossQuantity map ({
            DetailGUID: $.DetailGUID,AltGUID: $.AltGUID
        } spreadAcrossArray $.ShipTo)) //Map app the lineItemSpreadedAcrossQuantity with spreading them to lineItemSpreadedAcrossQuantity.ShipTo
    }
)

output application/json
---
{
    Num: payload.Num,Details: flatten(spreadLineItemAcrossLineQuantity(payload.LineItems))
    map {
        DetailGUID: $.DetailGUID,AltGUID: $.AltGUID,ShipToGUID: $.ShipToGUID
    }
} 

它需要稍后展平数组,因为您基本上是在 spreadAcrossArray 函数中传递一个对象,作为回报,您将获得一个数组。而且 map 函数也返回一个数组,所以你得到的是一个数组数组。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。