为了账号安全,请及时绑定邮箱和手机立即绑定

将 GoLang 中的 JSON 解析为结构体

将 GoLang 中的 JSON 解析为结构体

Go
慕无忌1623718 2021-12-20 17:11:17
所以,我在 golang 中解析这些数据时遇到了一些麻烦:{"gateways": [    {        "token": "my_token_here",        "gateway_type": "test",        "description": null,        "payment_methods": [            "credit_card",            "sprel",            "third_party_token",            "bank_account",            "apple_pay"        ],        "state": "retained",        "created_at": "2016-03-12T18:52:37Z",        "updated_at": "2016-03-12T18:52:37Z",        "name": "Spreedly Test",        "characteristics": [            "purchase",            "authorize",            "capture",            "credit",            "general_credit",            "void",            "verify",            "reference_purchase",            "purchase_via_preauthorization",            "offsite_purchase",            "offsite_authorize",            "3dsecure_purchase",            "3dsecure_authorize",            "store",            "remove",            "disburse",            "reference_authorization"        ],        "credentials": [],        "gateway_specific_fields": [],        "redacted": false    }]}使用这个结构时,我可以很容易地让它输出。type gateways struct {    Gateways []struct {        Characteristics       []string      `json:"characteristics"`        CreatedAt             string        `json:"created_at"`        Credentials           []interface{} `json:"credentials"`        Description           interface{}   `json:"description"`        GatewaySpecificFields []interface{} `json:"gateway_specific_fields"`        GatewayType           string        `json:"gateway_type"`        Name                  string        `json:"name"`        PaymentMethods        []string      `json:"payment_methods"`        Redacted              bool          `json:"redacted"`        State                 string        `json:"state"`        Token                 string        `json:"token"`        UpdatedAt             string        `json:"updated_at"`    } `json:"gateways"` }但是一旦我将“网关 [] 结构”分离到它自己的结构中,它就会返回一个空数组......
查看完整描述

2 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

您的ParseResponse函数存在问题,您正在调用json.Unmarshal作为第一个参数传递json,这是一个包名称:这是模棱两可的。


如您所见,您的代码在更改ParseResponse函数时运行良好。


package main


import (

    "encoding/json"

    "fmt"

)


type gateway struct {

    Characteristics       []string      `json:"characteristics"`

    CreatedAt             string        `json:"created_at"`

    Credentials           []interface{} `json:"credentials"`

    Description           interface{}   `json:"description"`

    GatewaySpecificFields []interface{} `json:"gateway_specific_fields"`

    GatewayType           string        `json:"gateway_type"`

    Name                  string        `json:"name"`

    PaymentMethods        []string      `json:"payment_methods"`

    Redacted              bool          `json:"redacted"`

    State                 string        `json:"state"`

    Token                 string        `json:"token"`

    UpdatedAt             string        `json:"updated_at"`

}


type gateways struct {

    Gateways []gateway `json:"gateways"`

}


func ParseResponse(js []byte) {

    var parsed gateways

    json.Unmarshal(js, &parsed)

    fmt.Println(parsed)

}


func main() {

    var js []byte = []byte(`{

"gateways": [

    {

        "token": "my_token_here",

        "gateway_type": "test",

        "description": null,

        "payment_methods": [

            "credit_card",

            "sprel",

            "third_party_token",

            "bank_account",

            "apple_pay"

        ],

        "state": "retained",

        "created_at": "2016-03-12T18:52:37Z",

        "updated_at": "2016-03-12T18:52:37Z",

        "name": "Spreedly Test",

        "characteristics": [

            "purchase",

            "authorize",

            "capture",

            "credit",

            "general_credit",

            "void",

            "verify",

            "reference_purchase",

            "purchase_via_preauthorization",

            "offsite_purchase",

            "offsite_authorize",

            "3dsecure_purchase",

            "3dsecure_authorize",

            "store",

            "remove",

            "disburse",

            "reference_authorization"

        ],

        "credentials": [],

        "gateway_specific_fields": [],

        "redacted": false

    }

]

}`)

    /*

        var parsed gateways

        e := json.Unmarshal(js, &parsed)

        if e != nil {

            fmt.Println(e.Error())

        } else {

            fmt.Println(parsed)

        }

    */

    ParseResponse(js)

}

输出:


{[{[purchase authorize capture credit general_credit void verify reference_purchase purchase_via_preauthorization offsite_purchase offsite_authorize 3dsecure_purchase 3dsecure_authorize store remove disburse reference_authorization] 2016-03-12T18:52:37Z [] <nil> [] test Spreedly Test [credit_card sprel third_party_token bank_account apple_pay] false retained my_token_here 2016-03-12T18:52:37Z}]}



查看完整回答
反对 回复 2021-12-20
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

看看http://play.golang.org/p/3xJHBmhuei - 解组到你的第二个网关定义成功完成,所以它一定是你缺少的东西。

检查 json.Unmarshal 调用是否返回错误。

PS 如果您成功地解组到网关的第一个版本,这可能不是问题,但是您上面给出的 JSON 字符串缺少右括号“}”。


查看完整回答
反对 回复 2021-12-20
  • 2 回答
  • 0 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信