簡體   English   中英

Map 使用 Dataweave 2.0 的 json 數組的特定索引中的附加鍵值

[英]Map an additional key-value in a specific index of a json array using Dataweave 2.0

我有一個輸入有效負載(json 數組),需要在特定索引中使用鍵值進行充實。 我的要求是將額外的鍵值(所有對象都相同)放在索引 1 處,所以我設法這樣做了:

輸入載荷:

[
  {
    "key1": "value1",
    "key3": "value3",
    "key4": "value4",
    "key5": "value5"
  },
  {
    "key1": "value1",
    "key3": "value3",
    "key4": "value4",
    "key5": "value5"
  },
  {
    "key1": "value1",
    "key3": "value3",
    "key4": "value4",
    "key5": "value5"
  }
]

腳本:


%dw 2.0
output application/json
---
payload map (
        ($)[&0] ++ {"key2": "value2"} ++ ($ - "key1")
    )

Output:

[
  {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
    "key4": "value4",
    "key5": "value5"
  },
  {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
    "key4": "value4",
    "key5": "value5"
  },
  {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
    "key4": "value4",
    "key5": "value5"
  }
]

我的問題是:如何動態地實現這一點?

謝謝,馬可

請嘗試以下腳本。 我們聲明了一個變量並將其添加到輸入數組的每個 object 中。 如果此鍵值是從有效負載或任何資源中獲取的,則您也可以根據要求在設置變量中聲明此變量。

%dw 2.0
output application/json
var keyValue = {
    "key2": "value2"
} 
---
payload map ((item, index) -> (item) ++ keyValue ) map ((item1, index) ->(item1) mapObject ((value, key, index) ->((key):value ) ) orderBy ((value, key) ->value ))

另一種選擇,你只需要給出一個索引位置(.g,2或3或4根據要求)來添加鍵值

%dw 2.0
output application/json
fun addKeyAtPosition(in : Object, position : Number,keyValue : Object)=(
    sizeOf(in) match {
        case size if(position <=0 ) -> (keyValue ++ in)
        case size if(position > size) -> (in ++ keyValue)
        case size if(position <= size) -> (in mapObject ((value, key, index) -> 
 (if ((index+1) == position)
 keyValue ++ ((key): value)
 else ((key): value))
))
else -> keyValue ++ in
    }
)

var keyValue= {
    "key2": "value2"
} 
---
payload map ((item, index) -> 
addKeyAtPosition(item,2,keyValue)        // here we are passing the index as 2
)
  1. 首先保留有效載荷的鍵,以便我們可以從第二個元素到 n-1
  2. k[1 到 -1] 因為你想在第一個索引 position 處插入而忽略第一個關鍵元素

數據中心

%dw 2.0
output application/json
var k=keysOf(payload[0])
---
payload map(item,index)-> (
       [(item[&0])] ++ [{"key2": "value2"}] ++ (k[1 to -1] map ($): (item[$]))   
) reduce($$++$)
        

Alternatitevely 您可以使用MinusMinus刪除元素

%dw 2.0
output application/json
---
payload map (
        ($)[&0] ++ {"key2": "value2"} ++ ($ -- (($)[&0]))
    )

Output

[
  {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
    "key4": "value4",
    "key5": "value5"
  },
  {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
    "key4": "value4",
    "key5": "value5"
  },
  {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
    "key4": "value4",
    "key5": "value5"
  }
]

首先我會刪除密鑰以防它已經存在,然后動態添加新的密鑰對。 如果您確定該鍵以前不存在於輸入元素中,則可以省略刪除操作。

%dw 2.0
output application/json
var key="key2"
var value="value2"
---
payload map (
        $ - key  ++ {(key): value}
)

暫無
暫無

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

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