JSON 负载中的内联转换特定属性包含 key/value 对的嵌套数组和对象
Inline transform specific attributes in JSON payload containing nested arrays and objects of key/value pairs
我有一个输入负载,我需要将其直接传递到输出,但我需要转换的特定日期属性除外。这些日期属性可以位于有效负载中的任何位置。即,
- 为key/value对
- 作为对象中的 key/value 对
- 作为数组中的 key/value 对
- as key/value 数组中对象内的对
我已经用下面的数据编织代码解决了上面的案例 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
运算符在这里会有帮助。
试试这个。我创建了一个函数 applyToValuesWhenKey
,它将输入值作为 e
,一个将值应用于 fn
的函数,以及一个 returns 布尔值的函数将指示是否将 fn
应用于名为 predicate
的值。它使用递归和 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 )
我有一个输入负载,我需要将其直接传递到输出,但我需要转换的特定日期属性除外。这些日期属性可以位于有效负载中的任何位置。即,
- 为key/value对
- 作为对象中的 key/value 对
- 作为数组中的 key/value 对
- as key/value 数组中对象内的对
我已经用下面的数据编织代码解决了上面的案例 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
运算符在这里会有帮助。
试试这个。我创建了一个函数 applyToValuesWhenKey
,它将输入值作为 e
,一个将值应用于 fn
的函数,以及一个 returns 布尔值的函数将指示是否将 fn
应用于名为 predicate
的值。它使用递归和 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 )