golang如何自定义json,典型的场景,json一个时间戳,显示成date样式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fwhezfwhez/article/details/82908195

自定义字段json,只需要继承marshaler和unmarshaler
官方的接口如下:

type Marshaler interface {
	MarshalJSON() ([]byte, error)
}
type Unmarshaler interface {
	UnmarshalJSON([]byte) error
}

所以直接订制该字段的接口实现即可

直接上代码了

package main

import (
	"encoding/json"
	"fmt"
	"time"
)
type TimeStamp  int64
type D struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
	Ts  TimeStamp   `json:"ts"`
}

func (d TimeStamp) MarshalJSON() ([]byte, error){
	rs :=time.Unix(int64(d),0).Format("2006-01-02")
	js,er := json.Marshal(rs)
	return js,er
}
func (d *TimeStamp) UnmarshalJSON(data []byte) error{
	var rs string
	e := json.Unmarshal(data,&rs)
	if e!=nil{
		return e
	}
	t,er:= time.Parse("2006-01-02", rs)
	if er!=nil{
		return er
	}
	*d = TimeStamp(t.Unix())
	return nil
}

func main() {
	d :=D{
		Name:"ft",
		Age:9,
		Ts: (TimeStamp)(time.Now().Unix()),
	}
	js,er:=json.Marshal(d)
	if er!=nil{
		fmt.Println(er.Error())
		return
	}
	fmt.Println("result:",string(js))

	var d2 D
	e:=json.Unmarshal(js,&d2)
	if e!=nil{
		fmt.Println(er.Error())
		return
	}
	fmt.Println("result:",d2)
}

结果:

result: {"name":"ft","age":9,"ts":"2018-09-30"}
result: {ft 9 1538265600}

猜你喜欢

转载自blog.csdn.net/fwhezfwhez/article/details/82908195