我正在尝试使用Dataweave 2.0从以下源/目标结构中获取数据。我已经尝试过使用嵌套映射和减少脚本的各种方法,但是有一些困难。
痛点是customFieldList,我想通过将根字段更改为scriptId来简化总体结构(为简便起见)。
任何建议/帮助将不胜感激。
源结构
{
"line": [{
"lineNumber": 0,
"credit": 17.98,
"customFieldList": {
"customField": [{
"internalId": "5780",
"scriptId": "custcol_del_externalid",
"value": "0000000111111"
},
{
"internalId": "1446",
"scriptId": "custcol_4601_witaxapplies",
"value": false
},
{
"internalId": "1837",
"scriptId": "custcol_nsts_gaw_col_approver",
"value": {
"internalId": "29540",
"name": "Alan Mcgee",
"typeId": "-4"
}
},
{
"internalId": "2648",
"scriptId": "custcol_foreign_expense",
"value": false
}
]
}
},
{
"lineNumber": 1,
"debit": 17.98,
"customFieldList": {
"customField": [{
"internalId": "5780",
"scriptId": "custcol_del_externalid",
"value": "0000000111111"
},
{
"internalId": "1446",
"scriptId": "custcol_4601_witaxapplies",
"value": false
},
{
"internalId": "1837",
"scriptId": "custcol_nsts_gaw_col_approver",
"value": {
"internalId": "29540",
"name": "Joe Davis",
"typeId": "-4"
}
},
{
"internalId": "2648",
"scriptId": "custcol_foreign_expense",
"value": false
}
]
}
}
]
}
目标结构
{
"line": [{
"lineNumber": 0,
"credit": 17.98,
"custcol_del_externalid": {
"value": "0000000111111",
"internalId": "5780"
},
"custcol_4601_witaxapplies": {
"value": false,
"internalId": "1446"
},
"custcol_nsts_gaw_col_approver": {
"value": false,
"internalId1": "1837",
"internalId2": "29540",
"name": "Alan Mcgee",
"typeId": "-4"
},
"custcol_foreign_expense": {
"value": false,
"internalId": "2648"
}
},
{
"lineNumber": 1,
"debit": 17.98,
"custcol_del_externalid": {
"value": "0000000111111",
"internalId": "5780"
},
"custcol_4601_witaxapplies": {
"value": false,
"internalId": "1446"
},
"custcol_nsts_gaw_col_approver": {
"value": false,
"internalId1": "1837",
"internalId2": "29540",
"name": "Joe Davis",
"typeId": "-4"
},
"custcol_foreign_expense": {
"value": false,
"internalId": "2648"
}
}
]
}
答案 0 :(得分:2)
结构可能有点复杂,最好简化一下,但是我发现的真正问题是试图从customField中的其他条目中添加多个internalId。我正在共享无法解决该部分但似乎与其余输出匹配的脚本:
%dw 2.0
output application/json skipNullOn="objects"
---
{
line: payload.line map (field, index1) -> {
lineNumber: field.lineNumber,
credit: field.credit,
debit: field.debit,
(field.customFieldList.customField map (val, index2) ->
{
(val.scriptId): {
value: val.value,
internalId: val.internalId
}
}
)
}
}
输出:
{
"line": [
{
"lineNumber": 0,
"credit": 17.98,
"custcol_del_externalid": {
"value": "0000000111111",
"internalId": "5780"
},
"custcol_4601_witaxapplies": {
"value": false,
"internalId": "1446"
},
"custcol_nsts_gaw_col_approver": {
"value": {
"internalId": "29540",
"name": "Alan Mcgee",
"typeId": "-4"
},
"internalId": "1837"
},
"custcol_foreign_expense": {
"value": false,
"internalId": "2648"
}
},
{
"lineNumber": 1,
"debit": 17.98,
"custcol_del_externalid": {
"value": "0000000111111",
"internalId": "5780"
},
"custcol_4601_witaxapplies": {
"value": false,
"internalId": "1446"
},
"custcol_nsts_gaw_col_approver": {
"value": {
"internalId": "29540",
"name": "Joe Davis",
"typeId": "-4"
},
"internalId": "1837"
},
"custcol_foreign_expense": {
"value": false,
"internalId": "2648"
}
}
]
}
可能已经解决,但是我现在没有更多时间。如果您可以简化结构或输出,将会更容易。
为了更快起见,我使用writer属性skipNullOn避免在属性为null时发出贷方和借方属性。
答案 1 :(得分:0)
让我开始说,您的输出丢失了Joe Davis
,您两次Alan Mcgee
都出现了,我猜错了。
我正在做出某些假设以使其正常运行。
我的假设是(1)如果value
是一个对象,则有一个internalId
字段,并且(2)从value
字段中发生了一个嵌套,即仅此而已。
我可能会对其进行简化或扩展-我现在没有时间。
仅供参考:请确认您的需求,我没有时间进行详尽的检查。
这是我的代码,它是独立的,因此只需将其复制并粘贴到Transform Message
处理器中即可。
编辑:我花了一些额外的时间,稍微更改了表达式,并添加了注释以解释表达式的作用。希望对您有所帮助。
%dw 2.0
output application/dw
var data = {
"line": [{
"lineNumber": 0,
"credit": 17.98,
"customFieldList": {
"customField": [{
"internalId": "5780",
"scriptId": "custcol_del_externalid",
"value": "0000000111111"
},
{
"internalId": "1446",
"scriptId": "custcol_4601_witaxapplies",
"value": false
},
{
"internalId": "1837",
"scriptId": "custcol_nsts_gaw_col_approver",
"value": {
"internalId": "29540",
"name": "Alan Mcgee",
"typeId": "-4"
}
},
{
"internalId": "2648",
"scriptId": "custcol_foreign_expense",
"value": false
}
]
}
},
{
"lineNumber": 1,
"debit": 17.98,
"customFieldList": {
"customField": [{
"internalId": "5780",
"scriptId": "custcol_del_externalid",
"value": "0000000111111"
},
{
"internalId": "1446",
"scriptId": "custcol_4601_witaxapplies",
"value": false
},
{
"internalId": "1837",
"scriptId": "custcol_nsts_gaw_col_approver",
"value": {
"internalId": "29540",
"name": "Joe Davis",
"typeId": "-4"
}
},
{
"internalId": "2648",
"scriptId": "custcol_foreign_expense",
"value": false
}
]
}
}
]
}
---
// Create a new object with a single field named `line`
// Iterate over the array in the `data.line`
line: data.line map { // Create an object where
// you remove the `customFieldList` from the inputs while maintaining the other fields
($ - "customFieldList"),
// Create an object with field names the values of the `scriptId` field.
(do { // Create a localized declaration (aka closure) changing the array into an object
// where each field is the value of the `scriptId` field
var cfs = $.customFieldList.customField groupBy $.scriptId
---
// Iterate over the custom fields (cfs) object
cfs mapObject (v,k) -> (
// The value is an array but I assume you will always have a single element in it.
// Take the only element in the array (while removing the `scriptId` field) and test it
(v[0] - "scriptId") match {
// Check if the `o.value` is an Object if it is create a new object with the same key
// while the value is a new object
case o if (o.value is Object) -> {(k): {
// add all fields from the object you are testing but the `internalId` and the `value`
(o -- ["internalId","value"]),
// add `internalId1` mapped to the top object's `internalId` field
internalId1: o.internalId,
// add `internalId2` mapped to the object stored in the `o.value.internalId`
internalId2: o.value.internalId,
// add all fields from the `o.value` but the `internalId`
(o.value - "internalId"),
// Finally just add `value: false to the new object
value: false
}}
// When `o.value` is not an object then keep it as is.
else -> {(k): $}
}
)
})
}
答案 2 :(得分:0)
这是另一个答案...希望有帮助
%dw 2.2
output application/json
var inpJson={
"line": [{
"lineNumber": 0,
"credit": 17.98,
"customFieldList": {
"customField": [{
"internalId": "5780",
"scriptId": "custcol_del_externalid",
"value": "0000000111111"
},
{
"internalId": "1446",
"scriptId": "custcol_4601_witaxapplies",
"value": false
},
{
"internalId": "1837",
"scriptId": "custcol_nsts_gaw_col_approver",
"value": {
"internalId": "29540",
"name": "Alan Mcgee",
"typeId": "-4"
}
},
{
"internalId": "2648",
"scriptId": "custcol_foreign_expense",
"value": false
}
]
}
},
{
"lineNumber": 1,
"debit": 17.98,
"customFieldList": {
"customField": [{
"internalId": "5780",
"scriptId": "custcol_del_externalid",
"value": "0000000111111"
},
{
"internalId": "1446",
"scriptId": "custcol_4601_witaxapplies",
"value": false
},
{
"internalId": "1837",
"scriptId": "custcol_nsts_gaw_col_approver",
"value": {
"internalId": "29540",
"name": "Joe Davis",
"typeId": "-4"
}
},
{
"internalId": "2648",
"scriptId": "custcol_foreign_expense",
"value": false
}
]
}
}
]
}
---
inpJson.line map(v1,k1) ->
{
(v1 mapObject(v2,k2) ->
{
(k2):v2
} - "customFieldList"
),
(v1.customFieldList.customField map (v3, k3) ->
{
(v3.scriptId): {
value: v3.value,
internalId: v3.internalId
}
}
)
}