golang1.6版本json包解析嵌套指针的问题小记

发布时间 2023-04-27 12:42:54作者: 黑熊一只

指针的指针问题

本地跑的好好的,测试环境跑的好好,预发布环境(准线上环境),跪了。

起因就是:

1 a := &struct{s:""}
2 json.Unmarshal([]byte{}, &a)
3 fmt.Println(a.s) //报错行

第一行代码进行 &取地址,获得指针变量。

第二行代码,进行json解析的时候,传入了&a, 指针的指针,a到了json包实际为: **a。

在第三行代码,go版本1.6环境中,会报错,panic。

内容为:

1 ····
2 PANIC:runtime error: invalid memory address or nil pointer dereference 
3 ····

空指针报错。

这个好解决

1 1 a := &struct{s:""}
2 2 json.Unmarshal([]byte{}, a) //直接传入即可 不再进行获取指针的动作从而造成指针的指针
3 3 fmt.Println(a.s) //报错行

 

关于嵌套指针丢失指针的问题

在Golang的1.6版本中,使用encoding/json包解析指针的指针时会出现错误。原因是1.6版本的编码器无法正确处理指针的指针,会导致在编码和解码过程中丢失一层指针。

而在新版本的Golang(1.7+)中, encoding/json包已经改进,可以自动处理指针的指针,不需要特殊处理。

所以总结来说,对于Golang 1.6版本处理指针的指针JSON编码问题,

有两种解决方案:

1. 升级Golang版本到1.7+,encoding/json包会自动处理指针的指针。

2. 在1.6版本使用NewEncoder和NewDecoder,设置SetEscapeHTML(false),手动管理指针层级。

关于2的解决方案:

例如,有如下结构:
1 go
2 type Foo struct {
3     Bar *Bar
4 }
5 
6 type Bar struct {
7     Baz string 
8 }

 

如果有如下数据:
1 go
2 bar := &Bar{"hello"}
3 foo := &Foo{bar} 
进行JSON编码后:
1 go
2 data, _ := json.Marshal(foo)
3 // 输出 {"Bar":{"Baz":"hello"}}
解码后:
1 go 
2 var foo Foo
3 json.Unmarshal(data, &foo)
4 // foo.Bar.Baz 输出 hello
5 // 但此时 foo.Bar 不是原来的指针,丢失了一层指针

 

为了解决这个问题,在1.6版本中,可以使用encoding/json中的Encoder和Decoder,并设置Encoder.SetEscapeHTML(false),手动管理指针。例如: