Json 围棋程序中的时间始终为0
我在这里尝试从Bitfinex API获取交易,并将其打印在屏幕上。除了时间,一切都很好 我想知道为什么在本例中它们总是打印为0001-01-01 00:00:00 在UnmarshalJSON中,“t”包含我需要的时间。它似乎没有坚持贸易结构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" "
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的方法。