Исключить несколько ключевых значений из json, которые уже отображены в некоторых - PullRequest
0 голосов
/ 31 октября 2018

Мне нужно удалить некоторые поля из вывода при отображении набора атрибутов.

Введите:

[
    {
        "eventType": "xxx",
        "entityId": "xxxxxx",
        "userName": "xxxxx",
        "dateTime": "2010-11-11T07:00:00Z",
        "status": "SHIPPED",
        "additionalData": {
            "quoteId": "xxxxx",
            "clientReferenceId": "Srites004",
            "modifiedDt": "2010-11-11T07:00:00Z",
            "packageId": "AIM_PACKAGE",
            "sbsOrderId": "TEST-TS-201809-79486",
            "orderReferenceId": "xxxxxx",
            "shipDate_1": "2010-11-11T07:00:00Z",
            "shipDate_2": "2010-11-12T07:00:00Z",
            "shipDate_3": "2010-11-13T07:00:00Z",
            "shipMethod_1": "UPS Ground",
            "shipMethod_3": "UPS Ground3",
            "shipMethod_2": "UPS Ground2",
            "trackingNumber_3": "333",
            "trackingNumber_1": "2222",
            "trackingNumber_2": "221"
        }
    }
]

Выход:

{
    "attribute_name": {
        "sbsOrderId": "xxx",
        "packageId": "xxxx"
    }
}

Эти поля не должны отображаться в выходных данных:

[ "ShipDate", "shipMethod", "Trackingnumber", "quoteId", "цитата-корректуры композиционно-PAGECOUNT", "цитата-корректуры композиционно-актив", "preflightErrorReport", "modifiedDt", "clientReferenceId », "schoolIds", "orderReferenceId"]

Мой текущий поток данных:

%dw 1.0
%output application/json skipNullOn="everywhere"
---
attribute_name:
            (pl.additionalData mapObject {
(($$) :[$]) when  not ( ($$ contains "shipDate") or ($$ contains "shipMethod") or ($$ contains "trackingNumber") or ($$ contains "quoteId")  or ($$ contains "quote-proof-composition-pageCount") or ($$ contains  "quote-proof-composition-asset") or ($$ contains  "preflightErrorReport") or ($$ contains "modifiedDt") or ($$ contains  "clientReferenceId") or ($$ contains "schoolIds") or ($$ contains "orderReferenceId"))})
    ]]}

Работает нормально, но мне нужно сделать dw более простым.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Если вы хотите очистить вещи, я думаю, что хороший способ сделать это - поместить ключи, которые вы не хотите, в массив, и убедиться, что ключ в объекте, который вы отображаете, находится в этом массив. Это позволяет очень легко добавлять / вычитать поля при изменении требований.

%dw 1.0
%output application/json

%var unwantedKeys = [
  "shipDate",
  "shipMethod",
  "trackingNumber",
  "quoteId",
  "quote-proof-composition-pageCount",
  "quote-proof-composition-asset",
  "preflightErrorReport",
  "modifiedDt",
  "clientReferenceId",
  "schoolIds",
  "orderReferenceId"
]

%function filterUnwantedKeys(value, key)
  {(key): value}
    unless (unwantedKeys contains (key as :string))
    otherwise {}
---
{
  attribute_name: 
    payload.additionalData mapObject filterUnwantedKeys($, $$)
}
0 голосов
/ 31 октября 2018

Вместо того, чтобы удалить все те, которые вам не нужны, как насчет того, чтобы оставить те, которые вам нужны?

%dw 1.0
%output application/json
---
attribute_name: payload.additionalData mapObject {
    sbsOrderId: $.sbsOrderId,
    packageId: $.packageId
}

Это дало желаемый результат:

{
  "attribute_name": {
    "sbsOrderId": "TEST-TS-201809-79486",
    "packageId": "AIM_PACKAGE"
  }
}

После разъяснения, это единственное, что приходит на ум, и оно не намного красивее:

%dw 1.0
%output application/json
---
attribute_name: payload.additionalData mapObject (
    $
    -- $["quoteId"]
    -- $["clientReferenceId"]
    -- $["modifiedDt"]
    -- $["orderReferenceId"]
    -- $["shipDate_1"]
    -- $["shipDate_2"]
    -- $["shipDate_3"]
    -- $["shipMethod_1"]
    -- $["shipMethod_2"]
    -- $["shipMethod_3"]
    -- $["trackingNumber_1"]
    -- $["trackingNumber_2"]
    -- $["trackingNumber_3"]
)
...