API调用中的JSON未正确解码,我得到一个空白结构

时间:2016-04-17 02:17:19

标签: json go

我的JSON看起来像这样:

{
  "website": {
    "id": 8,
    "account_id": 9,
    "name": "max",
    "website_url": "",
    "subscription_status": "trial",
    "created_at": "2016-01-24T01:43:41.693Z",
    "updated_at": "2016-02-21T01:17:53.129Z",
  }
}

我的网站结构如下:

type Website struct {
    Id                    int64     `json:"id"`
    AccountId             int64     `json:"account_id"`
    Name                  string    `json:"name"`
    WebsiteUrl            string    `json:"website_url"`
    SubscriptionStatus    string     `json:"subscription_status"`
    CreatedAt             time.Time `json:"created_at"`
    UpdatedAt             time.Time `json:"updated_at"`
}

然后我有一个公司结构:

type Company struct {
  Website Website
  api *API
}

所以在我的API客户端代码中我有这个:

res, status, err := api.request(endpoint, "GET", nil, nil)

if err != nil {
        return nil, err
    }
if status != 200 {
    return nil, fmt.Errorf("Status returned: %d", status)
}

r := map[string]Company{}
err = json.NewDecoder(res).Decode(&r)

fmt.Printf("things are: %v\n\n", r)

我得到的输出是:

things are: map[website:{{0 0          0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC} <nil>}]

我如何调试这个,我不确定为什么它没有使用正确的值设置Website结构。

更新

我添加了这个,我没有看到任何输出:

if err != nil {
        fmt.Printf("error is not nillllllll!!!:")
        fmt.Println(err)
        return nil, err
    }

1 个答案:

答案 0 :(得分:2)

这是因为您使用class A { int aVal; public: A(int); }; A::A(int aVal) { this->aVal = aVal; } class B : public A { int bVal; public: B(int, int) }; B::B(int aVal, int bVal) : A(aVal) { this->bVal = bVal; } &gt;设置了太多级别的嵌套map&gt; CompanyWebsite在其上有效地构建了另一个层,因此它期望嵌套三个级别的JavaScript对象。实际上,您提供的JSON只有两个map&gt; Company

所以有几种方法可以让它发挥作用;选择最适合你的那个。

你可以这样做:

Website

或者你可以这样做:

r := map[string]Website{}
json.NewDecoder(res).Decode(&r)