我设法修改了代码,因此即使存在空值,它也能正确显示所有表行
type NullString struct {
sql.NullString
}
func (ns *NullString) MarshalJSON() ([]byte, error) {
if !ns.Valid {
return []byte("null"), nil
}
return json.Marshal(ns.String)
}
type LogItem struct {
UserId string `form:"userid" json:"userid"`
UserDate string `form:"date" json:"date"`
CheckinTime NullString `form:"checkintime" json:"checkintime"`
CheckinLocation NullString `form:"checkinlocation" json:"checkinlocation"`
CheckoutTime NullString `form:"checkouttime" json:"checkouttime"`
CheckoutLocation NullString `form:"checkoutlocation" json:"checkoutlocation"`
}
db := DBconnect()
defer db.Close()
rows, err := db.Query("SELECT * FROM oc_log")
if err != nil {
log.Print(err)
}
for rows.Next() {
if err := rows.Scan(&logItem.UserId, &logItem.UserDate, &logItem.CheckinTime, &logItem.CheckinLocation, &logItem.CheckoutTime, &logItem.CheckoutLocation); err != nil {
log.Fatal(err.Error())
} else {
arrLogItem = append(arrLogItem, logItem)
}
}
{ “状态”:200, “ message”:“成功”, “数据”:[ { “ userid”:“ 9”, “ date”:“ 2019-09-25T00:00:00Z”, “ checkintime”:“ 0000-01-01T14:56:39 + 07:00”, “ checkinlocation”:“(100,100)”, “ checkouttime”:“ 0000-01-01T15:52:22 + 07:00”, “ checkoutlocation”:“(100,100)” }, { “ userid”:“ 10”, “ date”:“ 2019-09-27T00:00:00Z”, “ checkintime”:“ 0000-01-01T14:04:44 + 07:00”, “ checkinlocation”:“(123,321)”, “ checkouttime”:null, “ checkoutlocation”:null } ]}
现在的问题是如何将 0000-01-01T14:04:44 + 07:00 格式化为对用户友好的输出,例如 17:09:02 例子吗?
此代码无法编译:
func (ns *NullString) MarshalJSON() ([]byte, error) {
if !ns.Valid {
return []byte("null"), nil
}
return json.Marshal(time.Parse(time.RFC3339, ns.String))
}
调用json.Marshal的参数过多 有(时间,时间,错误) 想要(界面{})
答案 0 :(得分:0)
json.Marshal()
需要一个值,而time.Parse()
返回2个值:已解析的时间和一个错误。您必须自己处理,而不要将其传递给createNewUserData
,例如:
json.Marshal()
测试:
func (ns *NullString) MarshalJSON() ([]byte, error) {
if !ns.Valid {
return []byte("null"), nil
}
t, err := time.Parse(time.RFC3339, ns.String)
if err != nil {
return nil, err
}
return json.Marshal(t.Format("15:04:05"))
}
输出(在Go Playground上尝试):
ns := &NullString{}
data, err := json.Marshal(ns)
fmt.Println(string(data), err)
ns = &NullString{
NullString: sql.NullString{
String: time.Time{}.Add(time.Minute * 1029).Format(time.RFC3339),
Valid: true,
},
}
data, err = json.Marshal(ns)
fmt.Println(string(data), err)
还请注意接收器的类型。您使用了指针接收器(null <nil>
"17:09:00" <nil>
),但是在ns *NullString
结构中将NullString
用作非指针。这意味着在整理LogItem
的值时,将不会调用此LogItem
。因此,请改用非指针接收器。
NullString.MarshalJSON()