如何删除数据编织中所有键都为空值的对象?

how to remove objects that have all keys with null values in dataweave?

我有下面的有效载荷,我想删除所有键都为空值的对象,

  [
    {
       "Order" : "123",
       "Product" : "456"
    },
    {
      "Order" : "",
      "Product" : ""
    }
  ]

输出应该是这样的,

   [
    {
       "Order" : "123",
       "Product" : "456"
    }
   ]

您可以按条件过滤,使用 everyEntry() 函数查看并非所有值都是空的。

%dw 2.0
output application/json
import * from dw::core::Objects
---
payload filter ($ someEntry (value, key) -> !isEmpty(value))

这样的事情对你有用吗?

输入

[
    {
       "Order" : "123",
       "Product" : "456"
    },
    {
      "Order" : null,
      "Product" : null
    }
  ]

脚本

%dw 2.0
output application/json
import * from dw::core::Objects
var valuesOfInputObjects = payload map { ($ takeWhile((value, key) ->  value == null))}
---
payload -- valuesOfInputObjects

输出

[
  {
    "Order": "123",
    "Product": "456"
  }
]

None 已发布的解决方案处理嵌套结构或数组之类的事情,所以我想我应该把这个递归解决方案扔进去。这允许我们遍历对象的整个结构,直到我们找到第一个非空字段。

%dw 2.0
output application/json
import everyEntry from dw::core::Objects
import every from dw::core::Arrays

var allFieldsNull = (obj: Any) ->
    obj match {
        case is Object -> obj everyEntry (allFieldsNull($))
        case is Array -> (sizeOf(obj) == 0) or (obj every allFieldsNull($))
        //case is Array -> false
        else -> isEmpty(obj)
    }

---
payload filter !allFieldsNull($)

如果你想考虑一个空数组足以保留对象,因为从技术上讲它不是空的,你只需要注释掉 case is Array 行并取消注释它下面的行。

输入:

[
    {
       "Order" : "123",
       "Product" : "456"
    },
    {
      "Order" : "",
      "Product" : "",
      "Address": {
          "Field1": ""
      },
      "Test": [
        {
            "Order" : "",
            "Product" : "",
            "Address": {
                "Field1": ""
            }
        }
      ]
    },
    {
      "Order" : null,
      "Product" : null,
      "Address": {
          "Field1": null
      },
      "Test": [
        {
            "Order" : null,
            "Product" : null,
            "Address": {
                "Field1": "A value even in a deeply nested field means I show up"
            }
        }
      ]
    }
]

输出:

[
  {
    "Order": "123",
    "Product": "456"
  },
  {
    "Order": null,
    "Product": null,
    "Address": {
      "Field1": null
    },
    "Test": [
      {
        "Order": null,
        "Product": null,
        "Address": {
          "Field1": "A value even in a deeply nested field means I show up"
        }
      }
    ]
  }
]