JOLT转换问题:构建属性分组的对象数组
JOLT转换:将错误信息映射为独立的status对象
问题描述
需要将输入中的每个interfaceInvoiceLineRejections元素转换为status数组内的独立对象,包含StatusReasonCode和StatusReason字段。原JOLT Spec错误地将同类型错误合并到同一对象的数组中,不符合预期输出。
输入JSON
{"interfaceInvoiceLines": [{"LineNumber": 1,"interfaceInvoiceLineRejections": [{"RejectionDescription": "Invalid PO number","TempRejectionDescription": "Invoice line 1 - Invalid PO number"},{"RejectionDescription": "Billed quantity is below zero","TempRejectionDescription": "Invoice line 1 - Billed quantity is below zero"}]},{"LineNumber": 2,"interfaceInvoiceLineRejections": [{"RejectionDescription": "Invalid PO number","TempRejectionDescription": "Invoice line 2 - Invalid PO number"}]}]}
原JOLT Spec
[{"operation": "shift","spec": {"interfaceInvoiceLines": {"*": {"interfaceInvoiceLineRejections": {"*": {"RejectionDescription": {"Invalid PO number": {"#REF": "ApplicationResponse.DocumentResponse.Response.status[&3].StatusReasonCode","@(2,TempRejectionDescription)": "ApplicationResponse.DocumentResponse.Response.status[&3].StatusReason"},"Billed quantity is below zero": {"#OTH": "ApplicationResponse.DocumentResponse.Response.status[&3].StatusReasonCode","@(2,TempRejectionDescription)": "ApplicationResponse.DocumentResponse.Response.status[&3].StatusReason"}}}}}}]}]
实际输出(不符合预期)
{"ApplicationResponse": {"DocumentResponse": {"Response": {"status": [{"StatusReasonCode": ["REF","REF"],"StatusReason": ["Invoice line 1 - Invalid PO number","Invoice line 2 - Invalid PO number"]},{"StatusReasonCode": "OTH","StatusReason": "Invoice line 1 - Billed quantity is below zero"}]}}}}
预期输出
{"ApplicationResponse": {"DocumentResponse": {"Response": {"status": [{"StatusReasonCode": "REF","StatusReason": "Invoice line 1 - Invalid PO number"},{"StatusReasonCode": "OTH","StatusReason": "Invoice line 1 - Billed quantity is below zero"},{"StatusReasonCode": "REF","StatusReason": "Invoice line 2 - Invalid PO number"}]}}}}
问题分析
原Spec中使用status[&3],&3指向的是interfaceInvoiceLines的层级索引,导致同一行(LineNumber)下的相同类型错误被合并到同一个status对象中,最终字段值变成数组。我们需要为每个interfaceInvoiceLineRejections元素生成独立的status对象,避免合并。
修正后的JOLT Spec
方案1:用唯一索引标识每个错误
[ { "operation": "shift", "spec": { "interfaceInvoiceLines": { "*": { "interfaceInvoiceLineRejections": { "*": { "RejectionDescription": { "Invalid PO number": { "#REF": "ApplicationResponse.DocumentResponse.Response.status[&3_&1].StatusReasonCode", "@(2,TempRejectionDescription)": "ApplicationResponse.DocumentResponse.Response.status[&3_&1].StatusReason" }, "Billed quantity is below zero": { "#OTH": "ApplicationResponse.DocumentResponse.Response.status[&3_&1].StatusReasonCode", "@(2,TempRejectionDescription)": "ApplicationResponse.DocumentResponse.Response.status[&3_&1].StatusReason" } } } } } } } } ]
&3对应interfaceInvoiceLines的元素索引,&1对应interfaceInvoiceLineRejections的元素索引,两者组合确保每个错误对应唯一的数组位置,避免合并。
方案2:自动追加数组元素
[ { "operation": "shift", "spec": { "interfaceInvoiceLines": { "*": { "interfaceInvoiceLineRejections": { "*": { "RejectionDescription": { "Invalid PO number": { "#REF": "ApplicationResponse.DocumentResponse.Response.status[].StatusReasonCode", "@(2,TempRejectionDescription)": "ApplicationResponse.DocumentResponse.Response.status[#2].StatusReason" }, "Billed quantity is below zero": { "#OTH": "ApplicationResponse.DocumentResponse.Response.status[].StatusReasonCode", "@(2,TempRejectionDescription)": "ApplicationResponse.DocumentResponse.Response.status[#2].StatusReason" } } } } } } } } ]
status[]自动为每个错误创建新的数组元素,#2引用当前数组的上一个位置,确保StatusReasonCode和StatusReason属于同一个对象。
内容的提问来源于stack exchange,提问作者vinay singh
相关产品推荐
相关产品推荐

