为什么 json.Unmarshall 在某些情况下将数字转换为零?

问题描述

背景

我正在尝试分析来自 Reddit api 的用户数据。我已声明用户 type User struct { Kind string `json:"kind"` Data struct { ... Subreddit struct { ... } `json:"subreddit"` ... CreatedUtc float64 `json:"created_utc"` <--- ... } `json:"data"` } 如下:

func GetUser(url string) User {
    var response User
    resp,err := http.Get(url)

    if err != nil {
        ...
    }

    defer resp.Body.Close()

    body,err := IoUtil.ReadAll(resp.Body)

    if err != nil {
        ...
    }

    err = json.Unmarshal(body,&response)

    if err != nil {
        ...
    }

    fmt.Print(response.Data.CreatedUtc) <---

    return response
}

我从 api 请求数据并在此处打印。

created_utc

问题

当我请求此 endpoint 时,它打印 0,而我可以在浏览器中看到 {{1}} 时间戳为 1562538742。这似乎发生在绝大多数(但不是全部)情况下。>

我的类型转换有问题吗?

解决方法

要理解为什么它为零,您必须首先了解在 Go 中,类型不会像其他语言那样自动引用。默认情况下,变量 var abc int 的值为 0

在测试 JSON 是否正确解析时,您可以将类型的值更改为指针。这样,任何未填充的字段都是 nil 而不是该类型的默认值。

这样做,您可以查看返回的值是否为真,或者是否存在其他故障,例如错误的数据模型或失败的网络调用。

,

感谢@JimB 指出我没有检查响应的状态代码。我原以为它会在大于 400 时抛出错误,但根据 docs 情况并非如此。

就我而言,修改请求以包含用户代理标头解决了该问题。