Json 围棋程序中的时间始终为0

Json 围棋程序中的时间始终为0,json,go,unmarshalling,Json,Go,Unmarshalling,我在这里尝试从Bitfinex API获取交易,并将其打印在屏幕上。除了时间,一切都很好 我想知道为什么在本例中它们总是打印为0001-01-01 00:00:00 在UnmarshalJSON中,“t”包含我需要的时间。它似乎没有坚持贸易结构 package main import ( "encoding/json" "fmt" "io/ioutil" "net/http" "strconv" "

我在这里尝试从Bitfinex API获取交易,并将其打印在屏幕上。除了时间,一切都很好

我想知道为什么在本例中它们总是打印为0001-01-01 00:00:00

在UnmarshalJSON中,“t”包含我需要的时间。它似乎没有坚持贸易结构

package main

import (
        "encoding/json"
        "fmt"
        "io/ioutil"
        "net/http"
        "strconv"
        "time"
)

type Trade struct {
        Tid       int
        Timestamp myTime
}

type myTime time.Time

func (t myTime) String() string {
        when := time.Time(t)
        return when.Format("2006-01-02 15:04:05")
}

func (t myTime) UnmarshalJSON(b []byte) error {
        ts, err := strconv.Atoi(string(b))
        if err != nil {
                return err
        }

        t = myTime(time.Unix(int64(ts), 0))

        return nil
}

func main() {
        trades, _ := GetTrades()

        for _, trade := range trades {
                fmt.Printf("%d - %s\n", trade.Tid, trade.Timestamp)
        }
}

func GetTrades() (trades []Trade, err error) {
        r, err := http.Get("https://api.bitfinex.com/v1/trades/BTCUSD")
        defer r.Body.Close()

        body, _ := ioutil.ReadAll(r.Body)
        json.Unmarshal(body, &trades)

        return
}

您可以在指针接收器上解组。。否则,您只是在复制不相关的数据:

func (t *myTime) UnmarshalJSON(b []byte) error {
    //  ^^^^^^^ this
    ts, err := strconv.Atoi(string(b))
    if err != nil {
            return err
    }

    *t = myTime(time.Unix(int64(ts), 0))
 // ^^ this too

    return nil
}
我不确定在指针接收器中重新分配数据有多“安全”/“惯用”。。有人能澄清一下吗


(顺便说一句,这很有效。不确定它是否是“最佳实践”)

您可以在指针接收器上解组。。否则,您只是在复制不相关的数据:

func (t *myTime) UnmarshalJSON(b []byte) error {
    //  ^^^^^^^ this
    ts, err := strconv.Atoi(string(b))
    if err != nil {
            return err
    }

    *t = myTime(time.Unix(int64(ts), 0))
 // ^^ this too

    return nil
}
我不确定在指针接收器中重新分配数据有多“安全”/“惯用”。。有人能澄清一下吗


(顺便说一句,这是有效的。不确定它是否是“最佳实践”)

您不能在
中对值赋值,您必须使用指针或结构,一种方法是:

type MyTime struct {
    time.Time
}

func (t MyTime) String() string {
    when := time.Time(t.Time)
    return when.Format("2006-01-02 15:04:05")
}

func (t *MyTime) UnmarshalJSON(b []byte) error {
    ts, err := strconv.Atoi(string(b))
    if err != nil {
        return err
    }
    t.Time = time.Unix(int64(ts), 0)

    return nil
}

您不能在
UnmarshalJSON
中为值赋值,必须使用指针或结构,一种方法是:

type MyTime struct {
    time.Time
}

func (t MyTime) String() string {
    when := time.Time(t.Time)
    return when.Format("2006-01-02 15:04:05")
}

func (t *MyTime) UnmarshalJSON(b []byte) error {
    ts, err := strconv.Atoi(string(b))
    if err != nil {
        return err
    }
    t.Time = time.Unix(int64(ts), 0)

    return nil
}

出口我的贸易行吗?(将其命名为MyTrade
)您也可以发布一个json示例吗?返回
[]
是否
格式
未将时间转换为字符串?您是否应该使用正确的格式?您可以直接从该URL获取JSON,就像程序一样:格式是在String()方法中完成的。如果我在UnmarshalJSON方法中打印t变量,它将正确打印。它只是在主方法中不起作用。导出myTrade有效吗?(将其命名为MyTrade)您也可以发布一个json示例吗?返回
[]
是否
格式
未将时间转换为字符串?您是否应该使用正确的格式?您可以直接从该URL获取JSON,就像程序一样:格式是在String()方法中完成的。如果我在UnmarshalJSON方法中打印t变量,它将正确打印。它只是在主方法中不起作用。它运行良好,这是一种正确的做法,请检查我的答案是否有不同的方法。它运行良好,这是一种正确的做法,请检查我的答案是否有不同的方法。我同意,但对于最终用户来说,在输出包含单个属性的结构时,这一点就不那么明显了。我更喜欢在这种情况下直接返回时间。不过,谢谢你的回答@RooSoft很乐意为您提供帮助,但请记住,使用嵌入可以让您直接在myTime上使用time.time的方法。我同意,但对于最终用户来说,在输出包含单个属性的结构时,这一点就不那么明显了。我更喜欢在这种情况下直接返回时间。不过,谢谢你的回答@RooSoft很乐意为您提供帮助,同时请记住,使用嵌入可以让您直接在myTime上使用time.time的方法。