使用 Dataweave 将 CSV 映射到 JSON 时忽略空字符串

Ignore empty string when mapping CSV to JSON using Dataweave

我正在从 CSV 映射到 JSON,某些 CSV 字段在 JSON 映射中显示为“”。如何让 Dataweave 忽略“”并仅在有值时填充?

我试过 skipNullOn 但这不起作用。有没有其他方法可以做到这一点,还是我必须在每个字段周围添加 when 条件?

使用递归解决方案看到此错误:

谢谢

这是我构建的示例逻辑(猜猜,这就是您要找的)。如果它不起作用,请给我一个示例 CSV 和您期望的输出 JSON 格式,我会尝试为您获取逻辑。

Sample CSV Input (with one of the value missing in line 3 and 4)

header1,header2
1,value1
2,value2
3,
,value4

Dataweave

%dw 1.0
%output application/json
---
payload map {
    ("headerValue1": $.header1) when $.header1 != '',
    ("headerValue2": $.header2) when $.header2 != ''
}

Result

[
  {
    "headerValue1": "1",
    "headerValue2": "value1"
  },
  {
    "headerValue1": "2",
    "headerValue2": "value2"
  },
  {
    "headerValue1": "3"
  },
  {
    "headerValue2": "value4"
  }
]

考虑到您有四个字段,如果城市字段为 null 或为空,您希望跳过 city 字段,您还可以将 dataweave 脚本修改为以下内容:

%dw 1.0

%输出application/json

{ 人:有效载荷图((payload01,indexOfPayload01)-> { 名字:payload01.fname, 姓氏:payload01.lname, 地址:payload01.address, (city: payload01.city) 当 payload01.city !=null 和 payload01.city !='' }) }

尝试此解决方案,该解决方案改编自 acceptable 函数中的 . We recursively decide if we want to remove a field from the model, using match,用于删除空字符串、空值和空对象。

%dw 1.0
%output application/json

%function acceptable(value) (
    value match {
        :null -> false,
        o is :object -> o != {},
        s is :string -> s != "",
        default -> true
    }
)

%function filterKeyValue(key, value) (
    {(key): value} when acceptable(value) otherwise {}
)

%function removeFields(x)
    x match {
        a is :array -> a map removeFields($),
        o is :object -> o mapObject
            (filterKeyValue($$, removeFields($))),
        default -> $
    }
---
removeFields(payload)