小编典典

将GoLang中的JSON解析为struct

go

因此,我在解析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"` 
}

但是,一旦我将“ Gateways [] struct”分离成自己的结构,它就会返回一个空数组…

完整来源。

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() {
  var parsed gateways
  json.Unmarshal(json, &parsed)
}

阅读 262

收藏
2020-07-02

共1个答案

小编典典

您的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}]}
2020-07-02