如何正确地从有效载荷中添加和删除元素? (或有条件更换)

Posted

技术标签:

【中文标题】如何正确地从有效载荷中添加和删除元素? (或有条件更换)【英文标题】:how properly to add and remove elements from payload? (or replace on condition) 【发布时间】:2022-01-13 15:41:31 【问题描述】:

所以我有具有旧类型属性的有效负载,我想将它们迁移为所有其余逻辑正在使用的新属性。因此,在进行验证之前,我想对其进行一些修改。 目前我设法在单独的转换中添加和删除,但是否可以一次性完成?

示例负载:


  "country": "Country",
  "town": "Town",
  "district": "Dist",
  "owner": "Owner"

输出应该是:


  "country": "Country",
  "city": "Town",
  "area": "Dist",
  "owner": "Owner"

所以我添加了变换:

%dw 1.0
%output application/json
---
payload ++ city: payload.town
when 
  payload.town != null
otherwise
  payload ++ area: payload.distrinct
when
  payload.distrinct != null
otherwise
  payload

我想检查有效载荷是否在城镇键中没有空值,并使用城镇键值添加新的键城市,同样检查 distrinct 是否不为空,然后将其值添加为区域键。然而它只发生在城市(我知道它会被添加到底部,但在我的情况下顺序不是问题)但是钥匙可能不存在(它可能没有城镇,或者可能没有区分或可能两者都没有)

在下一次变换时:

%dw 1.0
%output application/json
---
payload -- town: payload.town
when 
  payload.town != null
otherwise
  payload

我尝试检查密钥是否存在然后删除旧的,但没有运气:( 有什么帮助吗?

【问题讨论】:

删除转换在哪里? 已添加,但与添加构造类似,只是有 -- 而不是 ++ 【参考方案1】:

这太复杂了。您可以使用mapObject 来转换每个键,而不是添加和删除键。然后参数化转换变得微不足道。同样,当值为 null 时,使用 default 比使用 when...otherwise 更简单。

%dw 1.0
%output application/json
%var keyMap= town: "city", district: "area" 
%function replaceKey(keyName) (keyMap[keyName] default keyName)
---
payload mapObject  ( (replaceKey($$)) : $ )

【讨论】:

好吧,我不是专家,这就是为什么要问一个更好的方法:) 我喜欢你的方法,非常感谢你的帮助。在那个函数中,如果没有城镇密钥(或地区),它会运行没有错误吗? 是的,它与处理其他密钥之一相同,例如所有者。 mapObject 为每个键独立工作。

以上是关于如何正确地从有效载荷中添加和删除元素? (或有条件更换)的主要内容,如果未能解决你的问题,请参考以下文章

如何有条件地从元组列表中删除元素?

如何有效地从 ArrayList 或字符串数​​组中删除所有空元素?

我如何有效地从 forward_list 中删除_if 只有一个元素?

有条件地从 Java 8 中的列表中删除元素 [重复]

如何在不使用 Set 的情况下有效地从数组中删除重复项

有条件地从Java 8中的List中删除元素[重复]