问题描述:

So, I'm having some trouble parsing this data in 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

}

]

}

When using this struct I can get it to output pretty easily.

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"`

}

But as soon as I seperate the "Gateways []struct" into its own struct then it returns an empty array...

Full source.

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)

}

网友答案:

There's a problem with your ParseResponse function, you're calling json.Unmarshal passing as first parameter json, that's a packge name: that's ambiguous.

As you can see, your code works well changing the ParseResponse function.

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)
}

Outputs:

{[{[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}]}
网友答案:

Take a look at http://play.golang.org/p/3xJHBmhuei - unmarshalling into your second definition of gateways completes successfully, so it must be something little that you're missing.

Check if the json.Unmarshal call returns an error.

P.S. It probably isn't the problem if you're unmarshalling successfully into the first version of gateways, but the JSON string that you've given above is missing a closing "}" bracket.

相关阅读:
Top