Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mule JSON负载中包含嵌套数组和键/值对对象的内联转换特定属性_Mule_Dataweave - Fatal编程技术网

Mule JSON负载中包含嵌套数组和键/值对对象的内联转换特定属性

Mule JSON负载中包含嵌套数组和键/值对对象的内联转换特定属性,mule,dataweave,Mule,Dataweave,我有一个输入负载,我需要直接传递到输出,除了我需要转换的特定日期属性。这些日期属性可以位于有效负载内的任何位置。i、 e 作为键/值对 作为对象中的键/值对 作为数组中的键/值对 作为数组中对象内的键/值对 我已经用下面的dataweave代码处理了上面的案例1和案例2。然而,我有点被案例3和案例4困住了。如果您能提供这方面的建议,我将不胜感激。谢谢 输入有效载荷: { "key1":"value1", "key2":"value2", "arrayList1":[

我有一个输入负载,我需要直接传递到输出,除了我需要转换的特定日期属性。这些日期属性可以位于有效负载内的任何位置。i、 e

  • 作为键/值对
  • 作为对象中的键/值对
  • 作为数组中的键/值对
  • 作为数组中对象内的键/值对
  • 我已经用下面的dataweave代码处理了上面的案例1和案例2。然而,我有点被案例3和案例4困住了。如果您能提供这方面的建议,我将不胜感激。谢谢

    输入有效载荷:

    {
       "key1":"value1",
       "key2":"value2",
       "arrayList1":[
          {
             "key3":"value3",
             "datefield_1":"13/01/2006",
             "datefield_2":"15/06/1980",
             "arrayList2":[
                {
                   "key4":"value4",
                   "datefield_3":"13/01/2000",
                   "datefield_4":"15/06/2003",
                   "arrayList2":[
                      {
                         "key5":"value5",
                         "datefield_5":"30/01/2000",
                         "datefield_6":"14/06/2003"
                      }
                   ]
                }
             ]
          },
          {
             "key6":"value6",
             "datefield_7":"20/02/2000"
          }
       ]
    }
    
    数据编织代码:

    %dw 1.0
     %output application/json
     %var keysToUpdate = ['datefield_1', 'datefield_2', 'datefield_3', 'datefield_4', 'datefield_5', 'datefield_6', 'datefield_7']
     %function transformDateFormat(inputDate) inputDate as :date {format: "dd/MM/yyyy"} as :date {format: "yyyy-MM-dd"}
     %function findKey(key) keysToUpdate contains key
     %function changePayload(input) input mapObject ({
         ($$): changePayload($) when $ is :object otherwise $
         } unless findKey($$ as :string) otherwise {
         ($$): transformDateFormat($)
     })
     ---
     changePayload (payload)  
    

    带有一些递归的
    match
    操作符在这里很有用

    试试这个。我创建了一个函数,
    applytowalueswhenkey
    ,它将输入值作为
    e
    ,一个将值作为
    fn
    应用的函数,以及一个返回布尔值的函数,该布尔值将指示是否将
    fn
    应用于名为
    谓词的值。它使用递归和
    match
    操作符在数据中循环,应用
    map
    mapObject
    ,或者根据当前值是否为对象、数组或其他任何内容返回给定值。剩下的是您的代码:

    %dw 1.0
    %output application/json
    
    %var input = {
       "key1":"value1",
       "key2":"value2",
       "arrayList1":[
          {
             "key3":"value3",
             "datefield_1":"13/01/2006",
             "datefield_2":"15/06/1980",
             "arrayList2":[
                {
                   "key4":"value4",
                   "datefield_3":"13/01/2000",
                   "datefield_4":"15/06/2003",
                   "arrayList2":[
                      {
                         "key5":"value5",
                         "datefield_5":"30/01/2000",
                         "datefield_6":"14/06/2003"
                      }
                   ]
                }
             ]
          },
          {
             "key6":"value6",
             "datefield_7":"20/02/2000"
          }
       ]
    }
    
    %var keysToUpdate = [ 'datefield_1', 'datefield_2', 'datefield_3', 'datefield_4', 'datefield_5', 'datefield_6', 'datefield_7' ]
    
    %function applyToValuesWhenKey( e, fn, predicate )
      e match {
        :array  -> $ map applyToValuesWhenKey( $, fn, predicate ),
        :object -> $ mapObject ( ( v, k ) -> { 
                                 ( k ): fn( v )
                               } when predicate( k ) otherwise {
                                 ( k ): applyToValuesWhenKey( v, fn, predicate )
                               }
                             ),
        default -> $
      }
    
    %function transformDateFormat( date ) 
      date as :date { format: "dd/MM/yyyy" } as :date { format: "yyyy-MM-dd" }
    
    %function transformDates( input )
      applyToValuesWhenKey( input, 
                            transformDateFormat,
                            ( ( key ) -> keysToUpdate contains ( key as :string ) ) )
    ---
    transformDates( input )