Fiber 2.48无法正确解析JSON请求中的paidAmount与totalAmount字段
问题分析:Fiber接口解析JSON嵌套字段为空的问题
问题场景
实现POST接口时,接收的JSON payload包含嵌套字段paidAmount和totalAmount,但解析后这两个字段的子字段始终为空,其他字段解析正常。
接收的JSON payload
{ "channelCode": "6014", "trxDateTime": "2022-12-30T14:52:04+07:00", "partnerServiceId": " 8099", "customerNo": "080012345123", "virtualAccountNo": "8099080012345123", "virtualAccountName": "Clive Morton", "referenceNo": "221230BI02639274", "paymentRequestId": "221230BI02639274", "hashedSourceAccountNo": "8a9c1fc0a64a5f77555b9cef1a3dac08", "paidAmount": { "value": "210", "currency": "USD" }, "totalAmount": { "value": "205", "currency": "USD" } }
结构体定义(原错误版本)
type VAPaymentRequest struct { Id string `json:"id" db:"id"` CreatedAt time.Time `json:"created_at" db:"created_at"` ChannelCode string `json:"channelCode" db:"channel_code"` TrxDateTime time.Time `json:"trxDateTime" db:"trx_date"` PartnerServiceId string `json:"partnerServiceId" db:"partner_service_id"` CustomerNo string `json:"customerNo" db:"customer_no"` VirtualAccountNo string `json:"virtualAccountNo" db:"virtual_account_no"` VirtualAccountName string `json:"virtualAccountName" db:"virtual_account_name"` ReferenceNo string `json:"referenceNo" db:"reference_no"` PaymentRequestId string `json:"paymentRequestId" db:"payment_request_id"` HashedSourceAccountNo string `json:"hashedSourceAccountNo" db:"hashed_source_account_not"` PaidAmount struct { Value string `json:"paidAmountValue" db:"paid_amount_value"` Currency string `json:"paidAmountCurrency" db:"paid_amount_currency"` } `json:"paidAmount"` TotalAmount struct { Value string `json:"totalAmountValue" db:"total_amount_value"` Currency string `json:"totalAmountCurrency" db:"total_amount_currency"` } `json:"totalAmount"` }
处理请求代码
func (qt *VAHandler) VAPayment(c *fiber.Ctx) error { var body domain.VAPaymentRequest if err := c.BodyParser(&body); err != nil { qt.Logger.Error("VAPayment-ParseBody", zap.Any("error", err)) return helper.Response(c, fiber.StatusBadRequest, "Bad Request", nil) } return helper.Response(c, fiber.StatusOK, "OK", body) }
返回结果(错误情况)
{ "code": 200, "data": { "id": "", "created_at": "0001-01-01T00:00:00Z", "channelCode": "6014", "trxDateTime": "2022-12-30T14:52:04+07:00", "partnerServiceId": " 8099", "customerNo": "080012345123", "virtualAccountNo": "8099080012345123", "virtualAccountName": "Clive Morton", "referenceNo": "221230BI02639274", "paymentRequestId": "221230BI02639274", "hashedSourceAccountNo": "8a9c1fc0a64a5f77555b9cef1a3dac08", "paidAmount": { "paidAmountValue": "", "paidAmountCurrency": "" }, "totalAmount": { "totalAmountValue": "", "totalAmountCurrency": "" } }, "message": "OK" }
问题原因
嵌套字段PaidAmount和TotalAmount的子字段JSON标签与实际JSON payload中的key不匹配:
- JSON里
paidAmount的子字段是value和currency,但结构体里对应标签写的是paidAmountValue和paidAmountCurrency - 同理,
totalAmount的子字段标签也和JSON中的value、currency不对应
Fiber的BodyParser依赖Go标准库的JSON解析,标签不匹配会导致无法映射值,最终字段为空。
修复方案
修改结构体中嵌套子字段的JSON标签,使其与JSON payload中的key完全一致:
type VAPaymentRequest struct { Id string `json:"id" db:"id"` CreatedAt time.Time `json:"created_at" db:"created_at"` ChannelCode string `json:"channelCode" db:"channel_code"` TrxDateTime time.Time `json:"trxDateTime" db:"trx_date"` PartnerServiceId string `json:"partnerServiceId" db:"partner_service_id"` CustomerNo string `json:"customerNo" db:"customer_no"` VirtualAccountNo string `json:"virtualAccountNo" db:"virtual_account_no"` VirtualAccountName string `json:"virtualAccountName" db:"virtual_account_name"` ReferenceNo string `json:"referenceNo" db:"reference_no"` PaymentRequestId string `json:"paymentRequestId" db:"payment_request_id"` HashedSourceAccountNo string `json:"hashedSourceAccountNo" db:"hashed_source_account_not"` PaidAmount struct { Value string `json:"value" db:"paid_amount_value"` // 修正json标签为"value" Currency string `json:"currency" db:"paid_amount_currency"` // 修正json标签为"currency" } `json:"paidAmount"` TotalAmount struct { Value string `json:"value" db:"total_amount_value"` // 修正json标签为"value" Currency string `json:"currency" db:"total_amount_currency"` // 修正json标签为"currency" } `json:"totalAmount"` }
修改后重新运行接口,paidAmount和totalAmount的子字段就能正确解析出对应的值。
内容的提问来源于stack exchange,提问作者anta40
相关产品推荐
相关产品推荐

