[golang] 结构体json序列化时,如何自定义时间格式-csdn博客


本站和网页 https://blog.csdn.net/weixin_34163741/article/details/88940254 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

[golang] 结构体json序列化时,如何自定义时间格式-CSDN博客
[golang] 结构体json序列化时,如何自定义时间格式
最新推荐文章于 2024-04-21 14:34:19 发布
weixin_34163741
阅读量1.2k 收藏 点赞数 文章标签: json golang 数据库 原文链接:
https://segmentfault.com/a/1190000012066145
版权
最近开发一个公司项目,发现Go语言结构体Json转换时,存在时间格式不一样问题。在网上找了很久也没有找到一个很好的方案。即结构体序列化后的格式是`1993-01-01T20:08:23.000000028+08:00`。但为了兼容公司以往的项目,希望沿用`1993-01-01 20:08:23`这种格式。网上找到了下面的代码,可以解决大部分的问题。
import "time"
const (
DateFormat = "2006-01-02"
TimeFormat = "2006-01-02 15:04:05"
type Time time.Time
func Now() Time {
return Time(time.Now())
func (t *Time) UnmarshalJSON(data []byte) (err error) {
now, err := time.ParseInLocation(`"`+TimeFormat+`"`, string(data), time.Local)
*t = Time(now)
return
func (t Time) MarshalJSON() ([]byte, error) {
b := make([]byte, 0, len(TimeFormat)+2)
b = append(b, '"')
b = time.Time(t).AppendFormat(b, TimeFormat)
return b, nil
func (t Time) String() string {
return time.Time(t).Format(TimeFormat)
但是这样写会对原有的struct产生影响,需要将原来的time.Time的变量类型替换成Time。可在使用一些ORM时就不行了,比如Beego的Orm就会报错了。因此,要在不改变结构体时间类型的情况下,替换掉原来的时间格式。就只能和上面的代码一样,给结构体也实现MarshalJson和UnmarshalJson方法。
type User struct {
Id
int
`json:"id"`
Name
string
`json:"name"`
CreatedAt time.Time `json:"created_at"`
func (u *User) MarshalJSON() ([]byte, error) {
type Alias User
user := &struct {
CreatedAt Time `json:"created_at"`
*Alias
}{Time(u.CreatedAt), (*Alias)(u)}
return json.Marshal(user)
func (u *User) UnmarshalJSON(data []byte) (err error) {
err = json.Unmarshal(data, user)
if err != nil {
return err
user.Alias.CreatedAt = time.Time(user.CreatedAt)
*u = User(*user.Alias)
return nil
func main() {
var user *User
user = &User{
Id: 4,
Name: "Liam",
CreatedAt: time.Now(),
bytes, _ := json.Marshal(user)
fmt.Printf("%v\n", string(bytes))
data := `{"id":3, "name":"Liam Lian", "created_at":"2017-11-18 19:00:00"}`
json.Unmarshal([]byte(data), &user)
fmt.Printf("%v\n", user)
虽然这样便实现了时间格式的兼容,而且不影响原来的结构体。但如果这样的结构体比较多的话,就会有很多的这类代码。于是就要用其他json包了。如
liamylian/jsontime
package main
import(
"fmt"
"time"
"github.com/liamylian/jsontime"
var json = jsontime.ConfigWithCustomTimeFormat
CreatedAt time.Time `json:"created_at" time_format:"sql_datetime" time_utc:"false"`
user := User {
Id:
1,
Name:
"Liam",
CreatedAt:
time.Now(),
fmt.Printf("%s", bytes)
优惠劵
关注
点赞
觉得还不错?
一键收藏
知道了
评论
最近开发一个公司项目,发现Go语言结构体Json转换时,存在时间格式不一样问题。在网上找了很久也没有找到一个很好的方案。即结构体序列化后的格式是`1993-01-01T20:08:23.000000028+08:00`。但为了兼容公司以往的项目,希望沿用`1993-01-01 20:08:23`这种格式。网上找到了下面的代码,可以解决大部...
复制链接
扫一扫
如何
自定义
序列化
应用详解
01-03
前言
Go语言作为一个由Google开发,号称互联网的C语言的语言,自然也对
JSON
格式支持很好。下面这篇文章主要介绍了关于
应用的相关内容,下面话不多说了,来一起看看详细的介绍吧
问题引入
当某个struct存在某个字段为string或者[]byte
类型
但是实际上保存的内容是
格式的数据
,对其进行
,比如
type Message struct {
From string
:from`
To string
:to`
Data string `
:data`
结构体
时间格式
化解决方案
chigaitan9729的博客
07-10
2119
最近开发项目
候发现一个
Json
转换的
问题。 即这种2019-07-01T20:08:23.000000028+08:00 这种表示UTC方法。从我们习惯来说,更喜欢希望的是 2019-07-01 20:08:23这种格式。 重新复现代码如下:
通过time.Time
别名
...
参与评论
您还未登录,请先
登录
后发表或查看评论
获取当前
时间
weixin_43202081的博客
08-19
2252
1.获取当前
import "time"
now_time := time.now()
fmt.Println(now_time)
打印结果:
2020-08-19 10:36:49.738716241 +0800 CST m=+0.000126403
2.获取
格式的当前
currentTime := now_t
Go实现
Bson
存入Mongo
恒Keep毅
05-25
1517
业务场景:
搞了个大作业,里面的话我们需要将前端传过来的
直接存入到Mongo方便后面直接取出来分析。然后我看了很多Go语言操作MongoDB实现增删改查的文档,但是需要转为对应的
然后存入,但是我们这个
没法固定,另辟蹊径吧,就有了以下操作(悄悄水一篇)
代码实现
以下的代码实现了增与查
package common
import (
"context"
"encoding/
"
"errors"
"time"
"go.
mongodb学习笔记
Peerless__的博客
10-28
1370
MongoDB是一个基于分布式文件存储的
。由C++语言编写。MongoDB是一个介于关系
和非关系
之间的产品,是非关系
当中功能最丰富,最像关系
的。他支持的数据结构非常松散,是类似
bson
格式,因此可以存储比较复杂的数据
。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系
单表查询的绝大部分功能,而且还支持对数据建立索引。https://www.mongodb.com/docs/manual/introduct
重写time包默认
格式
小草的博客
04-13
5175
背景
之前遇到一个需求,有一个字段属性是time.Time,需要的
time包默认的格式不一样,要求是yyyy/mm/dd hh:mm:ss的格式
time.Time默认
输出
time包有一个默认的
格式,参考如下例子
"fmt"
type Pe...
Golang
和 MongoDB 中的 ISODate
交互问题
热门推荐
独一无二的小个性
02-27
1万+
MongoDB 中有一种
数据 ISODate,参考如下:
如果在
中查询这条记录,
用什么
的变量来保存呢?
查找 ISODate
字段
中可以使用 time.Time 数据
来保存 MongoDB 中的 ISODate
type Model struct {
.ObjectId `
:"...
】mongo对于
Marshal
BSON
和Unmarshal
addice1019的博客
10-09
234
mongo对于
的操作, 将返回的
字段格式化为阅读友好的
字符串
Go语言time包用法总结
liyan_0816的博客
06-19
1052
一.
概述
在Go语言中
不是关键字而是使用time包下Time
time 包提供了
的显示和计量用的功能。日历的计算采用的是公历
默认显示为UTC,所以经常需要把
转换为字符串,显示成我们所熟悉的格式
1.1 Location
代表一个地区,并表示该地区所在的
区(可能多个)。Location 通常代表地理位置的偏移,比如 GMT东八区
time 包提供了 Location 的两个实例:Local 和 UTC。Local 代表当前系统本地
区;UTC 代表通用协调
数据
详解
qq_44033530的博客
02-21
489
基本数据
一基本数据
分类二字符串底层存储方式三值
和引用
分类
的基本数据
有五种:
整数型
小数型
字符型
布尔型
字符串型
二字符串底层存储方式
string:
默认编码方式UTF-8
存储:字符集+编码
的存储方式:data起始地址+字节个数
中字符串内容是不会修改的,所以编译器会把字符串分配到
只读内存段,若要修改,尽量重新定义或者通过转字节使用slice操作。
三值
定义:变
格式串实例代码
encoding/
fmt ) type IT struct { //一定要注意这里的成员变量的名字首字母必须是大写
Company string
Subjects []string
Isok bool
Price float64 } func main() {
s := IT{zyg, []string{go, python, ...
可能遇到的问题
12-26
而在日常开发中,我们经常遇到这样一个问题,就是要反
前端传递来的
,因为数据结构未知,所以我们便会使用map[string]interface{}来接收反
的结果。由于
解析到interface{}
候,...
Date Format (
的日期格式化)
weixin_30915951的博客
12-12
879
是一种流行地、广泛地应用于Internet的数据格式,相对于XML而言,它更小、解析更快。但可能就是由于“小”,
规范并没有定义如何
日期。尽管在社区已经有了很多这方面的讨论,但规范仍然未形成。争论的焦点在于日期
是否应直接采用数字或者ISO字符串日期,还是应该采用特殊分隔符标记的字符串日期。因为如果没有分隔符,就没法自我描述自身是一个日期
。先搁置争议,就各AJAX库和...
常用库之-mgo.v2包、MongoDB官方go-mongo-driver包、七牛Qmgo包 | go操作mongodb、mongodb
西京刀客
10-01
2794
mgo.v2包,已经跟不上mongo版本了,很早之前就停止维护了,后面会有更多的兼容性问题。不支持最新版本的mongo(5.x以上)!
中处理接口中的
(created_at等)
Edocevol
03-30
3221
中的time采用的是rfc3339
协议,mgo.v2不能直接将time.Time
的字段存入mongodb中 ,同样也不方便将mongo存储的timestamp转为time.Timer。因此,需要实现一个
Time。为了能够对mgo.v2的
支持,需要实现标准库中的Unmarshaler接口。实现了该接口能够将mongodb和
戳打通,还...
重载Marshal
实现
qq_44336275的博客
02-02
3801
背景:time.NOW()获得的
是RFC3339格式的,需要把他按照yyyy/MM/dd hh:mm:ss的格式进行
并返回给前端
解决方法:
给目标
创建一个别名,并对该别名重载Marshal
方法,例如:
//给time.Time创建别名为
Time
type
Time time.Time
//包含time.Time
字段的
,改用
Time这个
Create
xorm及time.Time
解决
日期格式记录
程序员记事本
05-08
9336
默认的time.Time
在转为
不是常用的2019-05-08 10:00:01这种格式,解决办法是
一个
,例如
type myTime time.Time ,然后针对myTime实现Marshaler接口的Marshal
package models
"database/sql/driver"
"time"...
字段格式
web开发小学生的专栏
08-26
1980
Go 自身的 time.Time
默认解析的日期格式是 RFC3339 标准, 也就是 2006-01-02T15:04:05Z07:00 的格式。
改成
的思路是:
定义一个内嵌time.Time的
,并重写Marshal
方法,然后在定义model的
候把time.Time
替换为我们自己的
即可。
废话不多说,先上代码片段。
Java面试八股之marshalling和demarshalling
最新发布
u012151345的博客
04-21
449
Marshalling(
)是将内存中的对象状态转化为适合传输或存储的格式(如字节流、
、XML),以便进行网络通信、持久化存储或跨平台/语言交互操作。-
、XML绑定库:如Jackson、Gson(
)和JAXB、XMLBeans(XML),实现对象与数据格式的互转。- 第三方库:如protobuf、Avro、Jackson、Gson,提供更灵活、高效的解决方案。3. 优化性能,减少传输量、提升速度,合理设计降低CPU和内存使用。2. 保证数据安全,通过加密、压缩、校验等手段。
中的
化传入list怎么写
05-30
假设有一个
定义如下:
```go
type Person struct {
Name string `
:"name"`
Age
:"age"`
```
如果要将多个 `Person`
实例组成的列表进行
,可以使用以下方式:
persons := []Person{
{Name: "Alice", Age: 20},
{Name: "Bob", Age: 25},
// 将 persons 列表进行
Bytes, err :=
.Marshal(persons)
if err != nil {
fmt.Println("
serialization error:", err)
// 输出
fmt.Println(string(
Bytes))
在上述代码中,`
.Marshal()` 函数将 `persons` 列表进行
,并返回一个字节数组。将字节数组转换成字符串后输出即可。注意,`Person`
中的 `Name` 和 `Age` 字段上使用了 `
` 标签,这样在
会使用标签指定的名称。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
CSDN认证博客专家
CSDN认证企业博客
码龄8年
暂无认证
145
原创
周排名
222万+
总排名
121万+
访问
等级
7352
积分
4798
粉丝
196
获赞
25
1186
私信
热门文章
Python 保存数据的方法(4种方法)
16622
abaqus重新划分网格
14762
git公钥出错"//.ssh/id_rsa" failed: No such file or directory
14505
如何实现json字符串和 BsonDocument的互相转换
7495
git命令(资源)
7427
最新评论
在ASP.NET MVC实现购物车,尝试一种不同于平常的购物车显示方式
qq_31265119:
启动不了啊
踩坑道路之——ubuntu下pt query digest无法分析慢查询日志
tizzybepeacejoy:
也可以可以升级到2.2.20这个版本
【跃迁之路】【579天】程序员高效学习方法论探索系列(实验阶段336-2018.09.07)...
Deep Learning小舟:
加油!写的真棒。
SpringCloud微服务框架搭建
Tisfy:
好文!,正如:紫泉宫殿锁烟霞,欲取芜城作帝家。
Mybatis源码分析-整体设计(一)
Nice!,古人云:流星飞玉弹,宝剑落秋霜。
最新文章
iOS极光推送集成步骤
设计模式之——单例模式(Singleton)的常见应用场景
Font and PDF
2019年
338篇
2018年
658篇
2017年
881篇
2016年
557篇
2015年
425篇
2014年
289篇
2013年
323篇
2012年
265篇
2011年
182篇
2010年
149篇
2009年
127篇
2008年
96篇
2007年
84篇
2006年
44篇
2005年
23篇
2004年
7篇
2002年
1篇
目录
被折叠的 
 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
红包个数最小为10个
红包总金额
红包金额最低5元
余额支付
当前余额
3.43
前往充值 >
需支付:
10.00
取消
确定
下一步
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值