如何删除dataweave中所有键都为空值的对象?

问题描述

我在有效负载下面有这个,我想删除所有键都为空值的对象,

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

输出应该是这样的,

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

解决方法

发布的解决方案都没有处理嵌套结构或数组之类的事情,所以我想我会在环中抛出这个递归解决方案。这允许我们遍历对象的整个结构,直到我们遇到第一个非空字段。

%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" : "","Address": {
                "Field1": ""
            }
        }
      ]
    },{
      "Order" : null,"Product" : null,"Address": {
          "Field1": null
      },"Test": [
        {
            "Order" : 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,"Address": {
          "Field1": "A value even in a deeply nested field means I show up"
        }
      }
    ]
  }
]
,

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

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

这样的事情对你有用吗?

enter image description here

输入

[
    {
       "Order" : "123","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"
  }
]