You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:35:11