-1

所以,我在用 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)
}
4

2 回答 2

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}]}
于 2016-03-13T13:21:52.680 回答
0

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

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

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

于 2016-03-13T13:05:44.160 回答