基于 'if key present or not' 的数据编织转换

Dataweave Transformation based on 'if key present or not'

我需要对密钥进行数据编织转换,如果它存在,如果密钥不存在则不需要。

样本输入

[
  {
    "Key1": "Value1",
    "Key2": {
         "Key2.1": "value2.1",
         "Key2.2": "Value2.2" 
         },
    "Key3": "Value3",
  },
  {
    "Key1": "Value11",
    "Key2": {
         "Key2.1": "value22.1"
         }
  }
]

样本输出

[
  {
    "KeyA": "Value1",
    "KeyB": {
         "KeyB.1": "value2.1",
         "KeyB.2": "Value2.2" 
         },
    "KeyC": "Value3"
  },
  {
    "KeyA": "Value11",
    "KeyB": {
         "KeyB.1": "value22.1"
         }
  }
]

预计不会

[
  {
    "KeyA": "Value1",
    "KeyB": {
         "KeyB.1": "value2.1",
         "KeyB.2": "Value2.2" 
         },
    "KeyC": "Value3"
  },
  {
    "KeyA": "Value11",
    "KeyB": {
         "KeyB.1": "value22.1"
         "KeyB.2": null
         },
    "KeyC": null
  }
]

问题1:真的是JSON格式吗?

问题2:如何在DW 2.0中进行这样的转换?

提前致谢:)

有两种方法可以做这种事情,

  1. 就是在对象上使用条件元素conditional element
{
   (a: payload.a) if(payload.a?)
}
  1. 有写手属性避免写nullskipNullOn
output application/json skipNullOn="everywhere"
---
{
  a: payload.a
} 
  1. 输入不是有效的 JSON 文档,因为在 Key3 之后有一个额外的逗号,但不清楚这是否是您要问的或为什么。

  2. 删除逗号后,输入是两个 JSON 对象的 JSON 数组。您可以使用 map() 来转换每个元素,然后使用 mapObject() 来转换每个对象中的键。 mapObject() 不会创建新键,只会转换现有键,因此不存在创建新键的风险。例如,我使用 transformKey() 来封装所需的密钥转换。我使用的是内置的 lower() 函数,但您可以使用任何您想要转换密钥的逻辑。

%dw 2.0
output application/json 
fun transformKey(k)= lower(k) 
---
payload map (
    $ mapObject ((value, key, index) -> (transformKey(key)): value )
)