Преобразование вложенного массива DataWeave 2.0 - PullRequest
0 голосов
/ 21 февраля 2020

Я работаю над попыткой получить из приведенных ниже структур источник / цель, используя Dataweave 2.0. Я пробовал разные способы, используя вложенные карты и уменьшая количество скриптов, но столкнулся с некоторыми трудностями.

Болевая точка - это customFieldList, я хочу упростить общую структуру, изменив поле root на 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"
            }
        }

    ]
}

Ответы [ 3 ]

2 голосов
/ 22 февраля 2020

Структура, вероятно, несколько сложна, и было бы лучше упростить ее, но реальная проблема, которую я обнаружил, заключается в попытке добавить несколько внутренних идентификаторов из других записей в customField. Я делюсь полученным скриптом, который не разрешает эту часть, но, кажется, соответствует остальным выводам:

%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"
      }
    }
  ]
}

Может быть решен Однако сейчас у меня нет больше времени. Если вы можете упростить структуру или вывод, это будет проще.

Чтобы быть быстрее, я использовал свойство писателя skipNullOn, чтобы избежать выдачи атрибутов credit и debit, когда они равны нулю.

0 голосов
/ 21 марта 2020

Вот еще один ответ ... Надеюсь, это поможет

%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
                    }
                }
        )   
}
0 голосов
/ 22 февраля 2020

Позвольте мне начать с того, что ваш вывод отсутствует 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): $}
            }
        )
    })
}
...