使用 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")
    )

输出:

[
  {
    "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"
  }
]

我的问题是:如何动态实现?

谢谢, 马可

  1. 首先保留有效载荷的键,以便我们可以从第 2 个元素到第 n-1 个元素进行交互
  2. k[1 到 -1] 因为您想在第一个索引位置插入而忽略第一个关键元素

DW

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

输出

[
  {
    "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 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
)

首先我会删除密钥以防它已经存在,然后动态添加新的密钥对。如果您确定该键以前不存在于输入元素中,则可以省略删除。

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