json:你或许还不知道的使用的坑(一)

本文总结了Go语言中JSON序列化时可能会遇到的一些问题,包括自定义序列化方法的选择、HTML标签的编码、数字转字符串、匿名结构体的细节处理、map的key类型限制、循环结构体的错误以及不支持的结构体类型。通过实例代码展示了这些问题的出现和解决方法,帮助读者避免序列化过程中的坑。
摘要由CSDN通过智能技术生成

前言

平时工作当中经常使用json的序列化或者反序列,但是偶尔也会发现你定义的结构体使用json序列化或者反序列化的时候不是你期望的结果,我也经常遇到这种,所以我通过读源码之后总结了一些可能让人诧异的操作,希望能规避一些错误场景,而且也会有源码解释的哦。我的所有的示例代码都是可以点击查看的哦,可以在The Go Playground自己试试哦。

一、自定义序列化:MarshalJSON

下面代码你觉得结果是多少呢?{"MarshalJSON":"hit func MarshalJSON"}吗?

代码如下:

type User struct {
   
	Name string
	Age  int
	Sex  bool
}

func (u *User) MarshalJSON() ([]byte, error) {
   
	return json.Marshal(map[string]string{
   
		"MarshalJSON": "hit func MarshalJSON",
	})
}
func main() {
   
	var zhangSan = User{
   
		Name: "Zhang San",
		Age:  18,
		Sex:  true,
	}
	bytes, err := json.Marshal(zhangSan)
	if err != nil {
   
		fmt.Println("error:", err)
	} else {
   
		fmt.Println("result:", string(bytes))
	}
}

运行得到的结果却是:

{
   "Name":"Zhang San","Age":18,"Sex":true}

如何修正?
第7行方法的接受者User不使用指针即可得到正确结果,代码如下:

func (u User) MarshalJSON() ([]byte, error) {
   
	return json.Marshal(map[string]string{
   
		"MarshalJSON": "hit func MarshalJSON",
	})
}

二、自定义序列化:TextMarshaler

我们对MarshalJSON很熟,但是自定义序列化还有另外一种方式:TextMarshaler接口,把结构体能序列化成文本格式,不一定是json格式的文本。
官方说明:

TextMarshaler is the interface implemented by an object that can
marshal itself into a textual form.
MarshalText encodes the receiver into UTF-8-encoded text and returns the result.

其实TextMarshaler也有MarshalJSON的问题,但是我这里想说的是当你的结构体同时实现了MarshalJSON和TextMarshaler之后,序列化的结果是什么呢?
代码如下:

type User struct {
   
	Name string
	Age  int
	Sex  bool
}

func (u User) MarshalJSON() ([]byte, error) {
   
	return json.Marshal(map[string]string{
   
		"MarshalJSON": "hit func MarshalJSON",
	})
}

func (u User) MarshalText() (text []byte, err error) {
   
	return []byte(
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangshen023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值