【问题标题】:How to ignore empty objects in DataWeave Mule esb如何忽略 DataWeave Mule esb 中的空对象
【发布时间】:2017-02-16 20:30:58
【问题描述】:

我正在转换我的有效载荷。我已经掌握了这里的情况。

输入负载如下所示:-

{
 "address": {
    "city": "bab",
    "company_name": "asdast",
    "country_code": "sam",
    "location": {
    "city": null,
    "state": null
  }
}}

我使用%output application/json skipNullOn = "everywhere" 它返回如下 JSON 格式

{
 "address": {
"city": "bab",
"company_name": "asdast",
"country_code": "sam",
"location": { }
}}

但是如果位置对象中的所有字段都是空的,我不想有空的位置对象。我期待这样的东西

{   
"address": {
"city": "bab",
"company_name": "asdast",
"country_code": "sam"
}}

【问题讨论】:

    标签: mule mule-studio mule-component mule-el dataweave


    【解决方案1】:

    使用此功能

    %function acceptable(value) (
        !isEmpty(value)
    )
    

    【讨论】:

      【解决方案2】:

      我有最简单最简单的解决方案。

      %dw 1.0
      %output application/json skipNullOn = "everywhere"
      ---
      {
          "address": {
          "city": payload.address.city,
          "company_name": payload.address.company_name,
          "country_code": payload.address.country_code,
          ("location": {
              "city": payload.address.location.city,
              "state": payload.address.location.state
        })
        } 
      }
      

      【讨论】:

        【解决方案3】:

        不幸的是,没有一个解决方案对我有用,所以我使用了第二个带有以下代码的“转换消息”组件,并在两个组件中都使用了 skipNullOn="everywhere"。此代码递归搜索空元素(空字段、空字符串、空数组和空对象)并将其删除。

        %dw 1.0
        %function removeEmptyInArray(arr) arr map (
            (removeEmptyInArray($) when $ is :array 
            otherwise (removeEmptyInObject($) when $ is :object
            otherwise $ when ($ != null and (sizeOf $) > 0) otherwise null))
        ) when arr != [] 
        otherwise null
        %function removeEmptyInObject(obj) obj mapObject (
            '$$': (removeEmptyInArray($) when $ is :array 
            otherwise (removeEmptyInObject($) when $ is :object
            otherwise $ when ($ != null and (sizeOf $) > 0) otherwise null))
        )
        
        %output application/json skipNullOn="everywhere"
        ---
        
        removeEmptyInObject(payload)
        

        希望对你有帮助。

        【讨论】:

          【解决方案4】:

          Ryan,该函数在 Studio 6.2.3 中产生错误。我必须包括一个其他条件。我必须将 (key):value 括在对象构造函数花括号中,并且必须包含一个 else 条件:

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

          【讨论】:

          • 不应将问题作为答案发布。您可以点击 按钮提出新问题并参考这篇文章。
          • @Anthony 你在说什么? Ethan 的回答是合理的,增加了对原始答案的看法,并添加了一些有用的评论。他的回答不是一个直接的问题。这是谈话的另一个分支。在您尝试监管其他用户的 cmets 之前,您可能应该先尝试解析它们。也许您应该了解内容而不是判断人。有一件事很清楚,你在拖钓。
          • @granthbr 对于提供虚假评论,我深表歉意。我没有评判回答者,但误判了他的回答。不幸的是,cmets 上没有反对按钮,但您可以标记我的评论并将其标记为您认为合适的内容。
          【解决方案5】:

          这是我在直接方法似乎难以理解之后得出的递归解决方案:

          %dw 1.0
          %output application/json
          
          %function acceptable(value) (
              (value default {}) != {}
          )
          
          %function filterKeyValue(key, value) (
              ((key): value) when acceptable(value)
          )
          
          %function removeFields(o) o
              unless o is :object
              otherwise o mapObject
                  (filterKeyValue($$, removeFields($)))
          
          ---
          removeFields(payload)
          

          这是我开始使用的直接方法:

          %dw 1.0
          %output application/json
          
          %function skipNulls(o) o 
              unless o is :object 
              otherwise o mapObject {
                  (($$): $) when ($ != null)
              }
          
          %function skipEmpty(o) o mapObject {
                  (($$): $) when ($ != {})
              }
          
          ---
          address: skipEmpty(payload.address
              mapObject { 
                  ($$): skipNulls($)
              }
          )
          

          请注意,我们在 %output 指令中删除了 skipNullOn="everywhere",并删除了函数中的空字段。这使我们能够确保在检查包含对象是否为空之前 删除空值。

          该函数(在两种解决方案中)都有效,因为mapObject 允许我们遍历对象字段,并且仅当它们满足特定条件时才将它们包含在结果对象中。

          【讨论】:

            【解决方案6】:

            这对我有用(注意 Dataweave 来自 Mule 版本 3.8):

            %function isEmpty(thing) thing match {
              :null -> true,
              arr is :array -> arr == [],
              obj is :object -> obj == {},
              '' -> true,
              /\s+/ -> true,
              default -> false
            }
            

            更新:

            因此,将其注入上述 Ryan 的解决方案中:

            %function acceptable(value) (
                !isEmpty(value)
            )
            

            【讨论】:

            • 您能否展示转换以产生最终输出(减去空瓶)?我认为我们需要递归。
            • 我认为这只会替换您的 acceptable 函数,因此解决方案的其余部分应该保留您编写的内容。 (尽管可能必须反转真值)——更新了我的答案以显示对 acceptable 函数的更改。
            【解决方案7】:

            没有直接的方法可以做到这一点,你可以这样做

            %dw 1.0
            %output application/json
            --- 
            address:  payload.address - "location" when (sizeOf (payload.address.location pluck $ filter $ != null)) == 0 otherwise payload
            

            希望这会有所帮助。

            【讨论】:

              猜你喜欢
              • 2018-12-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-11-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多