golang如何自定义json序列化应用详解

 更新时间:2018年08月14日 09:25:31   作者:咖啡加方糖  
son格式可以算我们日常最常用的序列化格式之一了,下面这篇文章主要给大家介绍了关于golang如何自定义json序列化应用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧

前言

Go语言作为一个由Google开发,号称互联网的C语言的语言,自然也对JSON格式支持很好。下面这篇文章主要介绍了关于golang自定义json序列化应用的相关内容,下面话不多说了,来一起看看详细的介绍吧

问题引入

当某个struct存在某个字段为string或者[]byte类型但是实际上保存的内容是json格式的数据时,对其进行json序列化,比如

type Message struct {
 From string  `json:"from"`
 To string  `json:"to"`
 Data string `json:"data"`
}

func main() {
 msg := Message{
  From: "XiaoMing",
  To: "LiGang",
  Data: `{"title":"test","body":"something"}`,
 }
 jsonData, err := json.Marshal(msg)
 if err != nil {
  panic(err)
 }
 fmt.Println(string(jsonData))
}

在上面的例子中,Data字段是string类型,但是保存的内容是json格式的数据,这个时候,程序输出:

{"from":"XiaoMing","to":"LiGang","data":"{\"title\":\"test\",\"body\":\"something\"}"}

可以看到,序列化之后的data是一个字符串。

如果Message对应的是数据库中的一张表,而data字段在数据库中是json类型,当我们需要一个接口,查询Message表中的记录返回给客户端。如果直接执行序列化,那么客户端获取到的Data实际上是一个字符串,客户端还需要自行对这个字符串进行json反序列化。

这时候我们就会想,有没有什么办法能够在服务端序列化Message时,将data字段序列化成json对象而不是字符串呢?

自定义序列化

因为data字段的值本身就是json类型,为什么不能在序列化时直接使用呢?

查看json包的官方文档,我们可以发现关于 自定义序列化 的例子

当执行json序列化时,如果对应的类型实现了 Marshaler 接口:

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

那么就会执行其 MarshalJSON 方法,并将返回的字节数组作为该值的序列化值。

那么回到上面的例子,我们就很容易实现目标:

type JsonString string

func (j JsonString) MarshalJSON() ([]byte, error) {
 fmt.Println("marshal...")
 return []byte(j), nil
}

type Message struct {
 From string  `json:"from"`
 To string  `json:"to"`
 Data JsonString `json:"data"`
}

在上面的代码中基于 string 类型声明了 JsonString ,代表json格式的字符串,并实现了Marshaler接口。因为JsonString代表的就是json字符串,直接将其转换成字节数组返回。

然后将Message中的Data字段换成JsonString类型。

再次执行程序,可以看到:

{"from":"XiaoMing","to":"LiGang","data":{"title":"test","body":"something"}}

Perfect!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • GO语言中embed简介

    GO语言中embed简介

    这篇文章主要介绍了GO语言中embed简介的相关资料,需要的朋友可以参考下
    2023-08-08
  • Go语言的变量定义详情

    Go语言的变量定义详情

    这篇文章主要介绍了Go语言的变量定义详情,go定义变量的方式和c,c++,java语法不一样,var 变量名类型,var在前,变量名在中间,类型在后面,下文更多详细内容需要的小伙伴可以参考一下
    2022-03-03
  • 浅析golang github.com/spf13/cast 库识别不了自定义数据类型

    浅析golang github.com/spf13/cast 库识别不了自定义数据类型

    这篇文章主要介绍了golang github.com/spf13/cast库识别不了自定义数据类型,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Go语言图片处理和生成缩略图的方法

    Go语言图片处理和生成缩略图的方法

    这篇文章主要介绍了Go语言图片处理和生成缩略图的方法,涉及Go语言针对图片操作的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Golang异常处理之优雅地控制和处理异常

    Golang异常处理之优雅地控制和处理异常

    在Golang中,异常处理是非常重要的一部分,能够有效地控制和处理代码中的异常情况。通过Golang的异常处理机制,可以优雅地捕获和处理异常,保障代码的可靠性和稳定性。同时,Golang还提供了丰富的工具和API,帮助开发者更加轻松地进行异常处理
    2023-04-04
  • Golang实现将视频按照时间维度剪切的工具

    Golang实现将视频按照时间维度剪切的工具

    这篇文章主要为大家详细介绍了如何利用Golang实现将视频按照时间维度进行剪切,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • Go命令行参数解析flag 包使用示例详解

    Go命令行参数解析flag 包使用示例详解

    这篇文章主要介绍了Go命令行参数解析flag 包使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • golang之数组切片的具体用法

    golang之数组切片的具体用法

    本文主要介绍了golang之数组切片的具体用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 用Go+Vue.js快速搭建一个Web应用(初级demo)

    用Go+Vue.js快速搭建一个Web应用(初级demo)

    这篇文章主要介绍了用Go+Vue.js快速搭建一个Web应用(初级demo),本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友参考下吧
    2017-11-11
  • 深入解析Go语言中上下文超时与子进程管理

    深入解析Go语言中上下文超时与子进程管理

    这篇文章小编将通过一个实际问题的案例,和大家深入探讨一下Go语言中的上下文超时和子进程管理,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10

最新评论