在 dataweave 2.0 中只更新有效载荷中的一个字段而不涉及其他字段

问题描述

考虑有效载荷...

{
  "name": "foo","age": 17,"gender": "Male"
}

我想根据条件更改年龄。我能够执行以下操作(有效负载可能有更多我们不感兴趣的键值对)

output application/java
---
payload ++ {age: (if(payload.age > 18) payload.age else 18}

但是正如你所看到的,输出格式是 java.lang.要将其转换为 JSON,我需要为它添加一个转换消息,这看起来不是一个好的编码实践,而且我无法承担使用额外转换消息的成本。如果我这样做

output application/json
---
payload ++ {age: (if(payload.age > 18) payload.age else 18}

我得到的输出

{
  "name": "foo","gender": "Male","age": 18
}

有没有其他方法可以做到这一点?

第 2 部分 难以处理嵌套对象的有效负载

{
  "name": "foo","data": {
    "personalData": {
      "age": 17,"gender": "Male"
    }
  }
}

解决方法

旧方法:

%dw 2.0
output application/json
---
{
    (payload - "age"),age: if (payload.age > 18) payload.age else 18
}

update 函数的新方法。

%dw 2.0
import * from dw::util::Values
output application/json
---
payload update "age" with (if (payload.age > 18) payload.age else 18)

更新第 2 部分。根据文档,您可以指定路径。阅读文档。

%dw 2.0
import * from dw::util::Values
output application/json
---
payload update ["data","personalData","age"] with (if (payload.data.personalData.age > 18) payload.data.personalData.age else 18)

我有点困惑;为什么您需要将其作为输入进行多次转换?只需使用 output application/json 设置您的转换。也不要使用对象连接来更改这样的值。