簡體   English   中英

使用 DataWeave 2.0 將有效負載轉換為自定義對象

[英]Transformation of Payload to custom object using DataWeave 2.0

我有一個輸入有效負載(json 數組),需要使用自定義格式進行豐富。

輸入有效載荷:

{
  "report": [
    {
      "totPills": 100,
      "food": "chm",
      "drink": "kgf",
      "202201": 1,
      "202202": null,
      "202203": 0.39
    },
    {
      "totPills": 100,
      "food": "mkm",
      "drink": "wfl",
      "202201": 0.0,
      "202202": 1.36,
      "202203": 0
    }
  ]
}

在上面的有效載荷屬性202201202202202203是動態屬性。

預期輸出:

{
  "totPills": 100,
  "report": [
    {
      "food": "chm",
      "drink": "kgf",
      "qty": {
        "202201": 1,
        "202202": null,
        "202203": 0.39
      }
    },
    {
      "food": "mkm",
      "drink": "wfl",
      "qty": {
        "202201": 0.0,
        "202202": 1.36,
        "202203": 0
      }
    }
  ]
}

我嘗試使用以下腳本來獲得上述結果(它沒有提供預期的結果):

%dw 2.0
import * from dw::core::Strings
output application/json

var dynWeek = "'202201','202202','202203'"

var pl = payload.report default[] map ((item, index) -> item - 'totPills' )
var pl1 = pl default [] map(($ default {}) mapObject ((value, key, index) -> {
    ((key):value) if ((dynWeek contains((key as String))) == false)
}) )
var pl2 = pl default [] map(($ default {}) mapObject ((value, key, index) -> {
    ((key):value) if ((dynWeek contains((key as String))))
}) )

---
{
    "totPills": payload.report[0].totPills,
    "report":pl1 ++ pl2 /* Not producing expected results */
}

我有幾個問題:

  1. 如何動態實現預期輸出
  2. 這種方法對性能有影響嗎?

謝謝,瑞克

我將report的映射分成兩組鍵值,它們的鍵在 dynWeek 中,而那些不在。

%dw 2.0
output application/json

var dynWeek = ['202201','202202','202203']

fun getInList(obj: Object, list: Array, in: Boolean)= obj filterObject ( 
    do {
        var isIn = list contains ($$ as String)
        ---
        if (in) isIn else !isIn
    }
)
---
{
    "totPills": payload.report[0].totPills,
    "report": payload.report 
                map ({
                        (getInList($ - "totPills", dynWeek, false)), // fields not in dynWeek
                        qty: getInList($, dynWeek, true)  // fields in dynWeek
                    })
}

輸出:

{
  "totPills": 100,
  "report": [
    {
      "food": "chm",
      "drink": "kgf",
      "qty": {
        "202201": 1,
        "202202": null,
        "202203": 0.39
      }
    },
    {
      "food": "mkm",
      "drink": "wfl",
      "qty": {
        "202201": 0.0,
        "202202": 1.36,
        "202203": 0
      }
    }
  ]
}

這應該有效:

%dw 2.0
output application/json
---
{
    "totPills": payload.report[0].totPills,
    "report": payload.report map {
        food: $.food,
        drink: $.drink,
        qty: ($ - "food" - "drink" - "totPills")
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM