使用JOLT cardinality-MANY转换PO_POD_LN_EVW1为列表及报错排查
问题描述
需求:编写JOLT定义,使用cardinality-MANY将对象PO_POD_LN_EVW1转换为列表,若该对象已是列表则忽略。
输入JSON:
{ "PURCHASE_ORDER_DISPATCH": { "MsgData": { "Transaction": { "PSCAMA": { "PUBLISH_RULE_ID": { "IsChanged": "Y" } }, "PO_POD_HDR_EVW1": { "STATE_BILL": "", "CURRENCY_CD": { "IsChanged": "Y", "content": "USD" }, "ADDRESS4_VNDR": "", "PO_POD_LN_EVW1": { "WG_ACCOUNT": 641100, "LINE_NBR": { "IsChanged": "Y", "content": 1 }, "ITM_ID_VNDR": "B0798CX2Q9", "PO_POD_SHP_EVW1": { "LINE_NBR": { "IsChanged": "Y", "content": 1 } } }, "WG_ADDR_SEQ_NUM": 1 } } } } }
当前使用的JOLT Spec:
{ "operation": "cardinality", "spec": { "PURCHASE_ORDER_DISPATCH": { "MsgData": { "Transaction": { "PO_POD_HDR_EVW1": "MANY" } } } } }
执行错误:Failed to Transform
解决方案
错误分析
当前Spec存在两个核心问题:
- 目标字段定位错误:需求要处理的是
PO_POD_LN_EVW1,但Spec错误地给父对象PO_POD_HDR_EVW1设置了MANY规则 - 对非数组的父对象直接应用
MANY规则会破坏原有JSON结构,导致转换失败
修正后的JOLT Spec
精准定位到PO_POD_LN_EVW1字段,为其应用MANY规则:
[ { "operation": "cardinality", "spec": { "PURCHASE_ORDER_DISPATCH": { "MsgData": { "Transaction": { "PO_POD_HDR_EVW1": { "PO_POD_LN_EVW1": "MANY" } } } } } } ]
转换效果
执行后,单个对象类型的PO_POD_LN_EVW1会被自动转换为数组;如果输入中该字段已是数组,则保持原结构不变。转换后的结果如下:
{ "PURCHASE_ORDER_DISPATCH": { "MsgData": { "Transaction": { "PSCAMA": { "PUBLISH_RULE_ID": { "IsChanged": "Y" } }, "PO_POD_HDR_EVW1": { "STATE_BILL": "", "CURRENCY_CD": { "IsChanged": "Y", "content": "USD" }, "ADDRESS4_VNDR": "", "PO_POD_LN_EVW1": [ { "WG_ACCOUNT": 641100, "LINE_NBR": { "IsChanged": "Y", "content": 1 }, "ITM_ID_VNDR": "B0798CX2Q9", "PO_POD_SHP_EVW1": { "LINE_NBR": { "IsChanged": "Y", "content": 1 } } } ], "WG_ADDR_SEQ_NUM": 1 } } } } }
内容的提问来源于stack exchange,提问作者Alexa
相关产品推荐
相关产品推荐

