修改现有 Json 键:Mule
Modify Existing Json key : Mule
我的输入
{
"Root": {
"order": [
{
"locale": "en-US",
"orderItems": [
{
"product": {
"partNumber": "23853864"
},
"itemSpecifics": {
"options": {
"color": "Olive",
"size": "S"
},
"actualPrice": "7",
"customItemData": {
"TEMP_8401": "8.95",
"TEMP_150207": "3.00"
}
}
}
]
}
... Large amount of JSON Data ...
]
}
}
预期输出
{
"Root": {
"order": [
{
"locale": "en-US",
"orderItems": [
{
"product": {
"partNumber": "23853864"
},
"itemSpecifics": {
"options": {
"color": "Olive",
"size": "S"
},
"actualPrice": "7",
"customItemData": {
"8401": "8.95",
"150207": "3.00"
}
}
}
]
}
... Large amount of JSON Data ...
]
}
}
我想删除"customItemData"
对象键中的"TEMP_"
,但我不想再次手动重新映射整个JSON对象,一个一个地分配属性。还有其他选择吗? DataWeave 中有更短的逻辑吗?我正在使用 Mule 3.9.0.
这使用递归和模式匹配遍历数据结构并修改键。如果密钥不包含字符串 "TEMP"
,则保持原样;如果包含,则根据您的要求进行修改。
%dw 1.0
%output application/json
%function applyToKeys(e, fn)
e match {
:array -> $ map ((v) -> applyToKeys(v, fn)),
:object -> $ mapObject ((v, k) -> {(fn(k)): applyToKeys(v, fn)}),
default -> $
}
---
applyToKeys(payload,
((key) -> ((key as :string) splitBy "_" )[1]
when ((key as :string) contains "TEMP")
otherwise key))
使用这样的解决方案时请记住权衡取舍。代码当然不那么冗长,但它需要对递归、模式匹配、lambda 和高阶函数等高级概念有扎实的理解。
我的输入
{
"Root": {
"order": [
{
"locale": "en-US",
"orderItems": [
{
"product": {
"partNumber": "23853864"
},
"itemSpecifics": {
"options": {
"color": "Olive",
"size": "S"
},
"actualPrice": "7",
"customItemData": {
"TEMP_8401": "8.95",
"TEMP_150207": "3.00"
}
}
}
]
}
... Large amount of JSON Data ...
]
}
}
预期输出
{
"Root": {
"order": [
{
"locale": "en-US",
"orderItems": [
{
"product": {
"partNumber": "23853864"
},
"itemSpecifics": {
"options": {
"color": "Olive",
"size": "S"
},
"actualPrice": "7",
"customItemData": {
"8401": "8.95",
"150207": "3.00"
}
}
}
]
}
... Large amount of JSON Data ...
]
}
}
我想删除"customItemData"
对象键中的"TEMP_"
,但我不想再次手动重新映射整个JSON对象,一个一个地分配属性。还有其他选择吗? DataWeave 中有更短的逻辑吗?我正在使用 Mule 3.9.0.
这使用递归和模式匹配遍历数据结构并修改键。如果密钥不包含字符串 "TEMP"
,则保持原样;如果包含,则根据您的要求进行修改。
%dw 1.0
%output application/json
%function applyToKeys(e, fn)
e match {
:array -> $ map ((v) -> applyToKeys(v, fn)),
:object -> $ mapObject ((v, k) -> {(fn(k)): applyToKeys(v, fn)}),
default -> $
}
---
applyToKeys(payload,
((key) -> ((key as :string) splitBy "_" )[1]
when ((key as :string) contains "TEMP")
otherwise key))
使用这样的解决方案时请记住权衡取舍。代码当然不那么冗长,但它需要对递归、模式匹配、lambda 和高阶函数等高级概念有扎实的理解。