返回顶部
首页 > 资讯 > 精选 >如何自定义Go Json的序列化方法
  • 410
分享到

如何自定义Go Json的序列化方法

2023-07-02 10:07:00 410人浏览 八月长安
摘要

这篇文章主要讲解了“如何自定义Go JSON的序列化方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何自定义Go json的序列化方法”吧!我们知道,通过tag,可以

这篇文章主要讲解了“如何自定义Go JSON的序列化方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何自定义Go json的序列化方法”吧!

我们知道,通过tag,可以有条件地实现定制Go JSON序列化的方式,比如json:",omitempty", 当字段的值为空的时候,我们可以在序列化后的数据中不包含这个值,而json:"-"可以直接不被JSON序列化,如果想被序列化key-,可以设置tag为json:"-,",加个逗号。

如果你为类型实现了MarshalJSON() ([]byte, error)UnmarshalJSON(b []byte) error方法,那么这个类型在序列化反序列化时将采用你定制的方法。

这些都是我们常用的设置技巧。

如果临时想为一个struct增加一个字段的话,可以采用本译文的技巧,临时创建一个类型,通过嵌入原类型的方式来实现。他和JSON and struct composition in Go一文中介绍的技巧还不一样(译文和jsoniter-go扩展可以阅读陶文的golang 中使用 JSON 的一些小技巧)。JSON and struct composition in Go一文中是通过嵌入的方式创建一个新的类型,你序列化和反序列化的时候需要使用这个新类型,而本译文中的方法是无痛改变原类型的MarshalJSON方式,采用Alias方式避免递归解析,确实是一种非常巧妙的方法。

以下是译文:

Go的 encoding/json序列化strcut到JSON数据:

package mainimport ("encoding/json""os""time")type MyUser struct {ID       int64     `json:"id"`Name     string    `json:"name"`LastSeen time.Time `json:"lastSeen"`}func main() {_ = json.NewEncoder(os.Stdout).Encode(&MyUser{1, "Ken", time.Now()},)}

序列化的结果:

{"id":1,"name":"Ken","lastSeen":"2009-11-10T23:00:00Z"}

但是如果我们想改变一个字段的显示结果我们要怎么做呢?例如,我们想把LastSeen显示为unix时间戳。

最简单的方式是引入另外一个辅助struct,在MarshalJSON中使用它进行正确的格式化:

func (u *MyUser) MarshalJSON() ([]byte, error) {return json.Marshal(&struct {ID       int64  `json:"id"`Name     string `json:"name"`LastSeen int64  `json:"lastSeen"`}{ID:       u.ID,Name:     u.Name,LastSeen: u.LastSeen.Unix(),})}

这样做当然没有问题,但是如果有很多字段的话就会很麻烦,如果我们能把原始struct嵌入到新的struct中,并让它继承所有不需要改变的字段就太好了:

func (u *MyUser) MarshalJSON() ([]byte, error) {return json.Marshal(&struct {LastSeen int64 `json:"lastSeen"`*MyUser}{LastSeen: u.LastSeen.Unix(),MyUser:   u,})}

但是等等,问题是这个辅助struct也会继承原始struct的MarshalJSON方法,这会导致这个方法进入无限循环中,最后堆栈溢出。

解决办法就是为原始类型起一个别名,别名会有原始struct所有的字段,但是不会继承它的方法:

func (u *MyUser) MarshalJSON() ([]byte, error) {type Alias MyUserreturn json.Marshal(&struct {LastSeen int64 `json:"lastSeen"`*Alias}{LastSeen: u.LastSeen.Unix(),Alias:    (*Alias)(u),})}

同样的技术也可以应用于UnmarshalJSON方法:

func (u *MyUser) UnmarshalJSON(data []byte) error {type Alias MyUseraux := &struct {LastSeen int64 `json:"lastSeen"`*Alias}{Alias: (*Alias)(u),}if err := json.Unmarshal(data, &aux); err != nil {return err}u.LastSeen = time.Unix(aux.LastSeen, 0)return nil}

感谢各位的阅读,以上就是“如何自定义Go Json的序列化方法”的内容了,经过本文的学习后,相信大家对如何自定义Go Json的序列化方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 如何自定义Go Json的序列化方法

本文链接: https://lsjlt.com/news/341312.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何自定义Go Json的序列化方法
    这篇文章主要讲解了“如何自定义Go Json的序列化方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何自定义Go Json的序列化方法”吧!我们知道,通过tag,可以...
    99+
    2023-07-02
  • 自定义Go Json的序列化方法译文
    编译自 Custom JSON Marshalling in Go。 前言 我们知道,通过tag,可以有条件地实现定制Go JSON序列化的方式,比如json:"...
    99+
    2024-04-02
  • SpringBoot @JsonDeserialize自定义Json序列化方式
    目录@JsonDeserialize自定义Json序列化1.问题2.现象3.解决办法@JsonSerialize与@JsonDeserialize使用1.以注解方式使用2.自定义实现...
    99+
    2024-04-02
  • 如何自定义Jackson序列化 @JsonSerialize
    目录自定义Jackson序列化 @JsonSerializejackson自定义全局序列化、反序列化创建序列化类创建反序列化类将两个类注册进入jackson核心对象objectMap...
    99+
    2024-04-02
  • Redis中怎么自定义序列化方法
    在Redis中,可以通过自定义序列化方法来对存储的数据进行序列化和反序列化。一种常见的方式是使用JSON格式来进行序列化,可以通过以...
    99+
    2024-04-29
    Redis
  • spring-session自定义序列化方式
    目录spring-session自定义序列化自定义序列方法使用jackson库配置spring-session序列化spring-session序列化问题排查问题解决方法spring...
    99+
    2024-04-02
  • spring-session自定义序列化方法是什么
    本篇内容介绍了“spring-session自定义序列化方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!spring-session...
    99+
    2023-06-22
  • SpringBoot 如何实现自定义Redis序列化
    目录问题环境入口点实现自定义序列化小结问题 在使用RedisTemplate存储对象时,如果采用JDK默认的序列化方式,数据会出现许多编码字符,辨析度不高。比如一个空的User对象,...
    99+
    2024-04-02
  • Redis中如何实现自定义序列化器
    在Redis中实现自定义序列化器需要使用Redis的自定义模块功能。Redis的自定义模块功能允许用户编写自定义的功能模块,并在Re...
    99+
    2024-04-29
    Redis
  • C#序列化怎么自定义
    在C#中,可以通过实现ISerializable接口来自定义对象的序列化方式。ISerializable接口要求实现GetObjec...
    99+
    2024-03-01
    C#
  • springboot jackson自定义序列化和反序列化实例
    目录jackson自定义序列化和反序列序列化JsonSerializer最后请求http返回对象反序列化JsonDeserializer小结一下springboot 自定义序列化器j...
    99+
    2024-04-02
  • python魔法方法-自定义序列详解
    自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等)。 如果要实现这个功能,就要遵循 python 的相关...
    99+
    2022-06-04
    自定义 序列 详解
  • Go json反序列化“null“的问题如何解决
    本文小编为大家详细介绍“Go json反序列化“null“的问题如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go json反序列化“null“的问题如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-07-05
  • java自定义序列化的具体使用
    目录1.问题引出 2.解决办法 3.另外一种自定义序列化机制(介绍Externalizable) 1.问题引出 在某些情况下,我们可能不想对于一个对象的所有field进行序列化,例...
    99+
    2024-04-02
  • 实现JSON序列化和反序列化的方法在Golang中
    Golang中JSON序列化和反序列化的实现方式 JSON (JavaScript Object Notation) 是一种常用的数据交换格式,它以文本的形式表示结构化数据。在Golang中,我们可以使用内置...
    99+
    2024-01-29
    Golang 序列化 JSON 实现方式 反序列化
  • java如何利用FastJSON、Gson、Jackson三种Json格式工具自定义时间序列化
    Java处理JSON数据有三个比较流行的类库FastJSON、Gson和Jackson。JacksonJackson是由其社区进行维护,简单易用并且性能也相对高些。但是对于复杂的bean转换Json,转换的格式鄙视标准的Json格式。PS:...
    99+
    2023-05-31
    java fastjson gson
  • 如何使用Serializable接口来自定义PHP中类的序列化
    目录Serializable接口各种类型的数据进行序列化的结果对象在使用Serializable接口序列化时要注意的地方未定义类的反序列化操作总结关于PHP中的对象序列化这件事儿,之...
    99+
    2024-04-02
  • Flask自定义序列化超详细讲解
    目录1、问题溯源2、flask序列化3、解决方法1、问题溯源 重点就是一个Flask.make_response,这里会做请求的响应的处理。 里面行代码: elif isinsta...
    99+
    2022-11-13
    Flask序列化 Flask自定义序列化
  • 如何在html中自定义有序列表
    如何在html中自定义有序列表?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。list-style-type 属性设置列表项标记的类型。语法:元素{list-style-ty...
    99+
    2023-06-15
  • C#如何对Json进行序列化和反序列化
    这篇“C#如何对Json进行序列化和反序列化”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#如何对Json进行序列化和反序...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作