Исключите несколько ключевых значений из json, которые уже отображаются в некоторых из них.

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

Вход:

[
    {
        "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", "quote-proof-композиция-pageCount", "quote-proof-композиция-актив", "preflightErrorReport", "modifiedDt", "clientReferenceId", " schoolIds "," orderReferenceId "]

Мой текущий dataweave:

%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 более простым.

Какие-либо предложения?

1
0
60
2

Ответы 2

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

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

на самом деле ввод идет по-другому (означает, что появится новое поле), поэтому

Karthik Raja J 31.10.2018 14:22

Спасибо тебе за пояснение. :)

utechtzs 31.10.2018 14:23

это будет долго

Karthik Raja J 31.10.2018 15:34

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

%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($, $$)
}

Другие вопросы по теме