仅当条件为真时更改数组元素中 json 的字段
Change field of json in element of array only if condition is true
全部。
我正在尝试更改 json 中数组元素中字段的值,条件是:如果 "field1" 的值等于 "value1",则将字段 "changethisfield" 的值更改为 "new_value"。
当前负载:
{
"message": [
{
"field1": "value1",
"field2": "value2",
"changethisfield": ""
},
{
"field1": "value3",
"field2": "value4",
"changethisfield": ""
}
]
}
数据编织代码:
%dw 2.0
output application/json
var itemValue = payload.message map (item) -> {
(item mapObject (value, key, index) -> {
((key): value) if (key as String != 'changethisfield'),
(changethisfield: "new_value") if (key as String == 'changethisfield')
})
}
---
{
"message": {
item: itemValue
}
}
但是这段代码改变了数组所有元素的值(当前输出):
{
"message": {
"item": [
{
"field1": "value1",
"field2": "value2",
"changethisfield": "new_value"
},
{
"field1": "value3",
"field2": "value4",
"changethisfield": "new_value"
}
]
}
}
期望的输出(只有 "field1" 包含 "value1" 的 "changethisfield" 项的值应更改为 "new_value"):
{
"message": {
"item": [
{
"field1": "value1",
"field2": "value2",
"changethisfield": "new_value"
},
{
"field1": "value3",
"field2": "value4",
"changethisfield": ""
}
]
}
}
请帮助理解我如何在数组元素中设置条件并解决此任务。谢谢!
这应该有效:
%dw 2.0
output application/dw
var data = {
"message": [
{
"field1": "value1",
"field2": "value2",
"changethisfield": ""
},
{
"field1": "value3",
"field2": "value4",
"changethisfield": ""
}
]
}
---
message: data.message map {
($ - "changethisfield"),
changethisfield: if ($.field1 == "value1") "new_value" else $.changethisfield
}
想补充一点,您也可以使用 update
函数,而不是手动删除重新添加字段到对象。这也可以将数组中的每个项目更改为特定值,但由于您有条件,因此必须在地图内执行它。
您的比较的问题是您在对象级别进行了比较,并且仅当键是特定字符串时才进行比较。您没有检查 field1 是否具有特定值。
%dw 2.0
output application/json
import * from dw::util::Values
var inputData = {
"message": [
{
"field1": "value1",
"field2": "value2",
"changethisfield": ""
},
{
"field1": "value3",
"field2": "value4",
"changethisfield": ""
}
]
}
---
{
message: inputData.message map ((item, index) -> (
if (item.field1 == "value1") (
item update "changethisfield" with "newValue"
) else (
item
)
))
}
全部。 我正在尝试更改 json 中数组元素中字段的值,条件是:如果 "field1" 的值等于 "value1",则将字段 "changethisfield" 的值更改为 "new_value"。 当前负载:
{
"message": [
{
"field1": "value1",
"field2": "value2",
"changethisfield": ""
},
{
"field1": "value3",
"field2": "value4",
"changethisfield": ""
}
]
}
数据编织代码:
%dw 2.0
output application/json
var itemValue = payload.message map (item) -> {
(item mapObject (value, key, index) -> {
((key): value) if (key as String != 'changethisfield'),
(changethisfield: "new_value") if (key as String == 'changethisfield')
})
}
---
{
"message": {
item: itemValue
}
}
但是这段代码改变了数组所有元素的值(当前输出):
{
"message": {
"item": [
{
"field1": "value1",
"field2": "value2",
"changethisfield": "new_value"
},
{
"field1": "value3",
"field2": "value4",
"changethisfield": "new_value"
}
]
}
}
期望的输出(只有 "field1" 包含 "value1" 的 "changethisfield" 项的值应更改为 "new_value"):
{
"message": {
"item": [
{
"field1": "value1",
"field2": "value2",
"changethisfield": "new_value"
},
{
"field1": "value3",
"field2": "value4",
"changethisfield": ""
}
]
}
}
请帮助理解我如何在数组元素中设置条件并解决此任务。谢谢!
这应该有效:
%dw 2.0
output application/dw
var data = {
"message": [
{
"field1": "value1",
"field2": "value2",
"changethisfield": ""
},
{
"field1": "value3",
"field2": "value4",
"changethisfield": ""
}
]
}
---
message: data.message map {
($ - "changethisfield"),
changethisfield: if ($.field1 == "value1") "new_value" else $.changethisfield
}
想补充一点,您也可以使用 update
函数,而不是手动删除重新添加字段到对象。这也可以将数组中的每个项目更改为特定值,但由于您有条件,因此必须在地图内执行它。
您的比较的问题是您在对象级别进行了比较,并且仅当键是特定字符串时才进行比较。您没有检查 field1 是否具有特定值。
%dw 2.0
output application/json
import * from dw::util::Values
var inputData = {
"message": [
{
"field1": "value1",
"field2": "value2",
"changethisfield": ""
},
{
"field1": "value3",
"field2": "value4",
"changethisfield": ""
}
]
}
---
{
message: inputData.message map ((item, index) -> (
if (item.field1 == "value1") (
item update "changethisfield" with "newValue"
) else (
item
)
))
}