Go json反序列化“null“结果为nil踩坑
Go json反序列化"null"结果为nil踩坑
先说结论,“null"是json的一个关键字,jsoniter这个库【其他库没测】在进行json序列化时,会把nil【即指针类型(比如slice、map和*T)的未初始化时的形态】序列化为字符串"null”,反序列化时会把字符串"null",如果目标类型是指针类型,则会反序列化为nil,但是目标结构体内部的自定义type的指针类型不会成为nil【见测试代码图二的mal的E字段,但这就有点不懂为啥了…】
建议对**“null”**进行一下特殊处理,或者序列化空指针类型
测试代码
需要注意的是fmt很多时候打印nil的指针类型时不会输出nil,比如nil的slice和map,会打印成[]和map[];
package main
import (
"fmt"
jsoniter "github.com/json-iterator/go"
)
type Marshaler struct {
A map[string]interface{
}
B []string
C [10]int
D *string
E *EE
F string
g string
}
type EE struct {
EEE []string
}
func main() {
mal := Marshaler{
E: &EE{
},
}
mal1 := &Marshaler{
}
e1 := &EE{
}
e2 := EE{
EEE: []string{
}}
var t1 *string
var t2 []int
var t3 map[string]interface{
}
var t4 = make([]string, 0)
res1, _ := jsoniter.MarshalToString(mal)
res2, _ := jsoniter.MarshalToString(mal1)
res3, _ := jsoniter.MarshalToString(e1)
res4, _ := jsoniter.MarshalToString(e2)
res5, _ := jsoniter.MarshalToString(t1)
res6, _ := jsoniter.MarshalToString(t2)
res7, _ := jsoniter.MarshalToString(t3)
res8, _ := jsoniter.MarshalToString(t4)
fmt.Printf("res1: %+v
", res1)
fmt.Printf("res2: %+v
", res2)
fmt.Printf("res3: %+v
", res3)
fmt.Printf("res4: %+v
", res4)
fmt.Printf("res5: %+v
", res5)
fmt.Printf("res6: %+v
", res6)
fmt.Printf("res7: %+v
", res7)
fmt.Printf("res8: %+v
", res8)
params := make(map[string]interface{
})
if err := jsoniter.Unmarshal([]byte(res6), ¶ms); err != nil {
fmt.Println("null Unmarshal err:", err)
} else {
fmt.Printf("null Unmarshal map: %+v
", params)
}
if err := jsoniter.Unmarshal([]byte(res6), &mal); err != nil {
fmt.Println("null Unmarshal err:", err)
} else {
fmt.Printf("null Unmarshal Marshaler: %+v
", mal)
}
if err := jsoniter.Unmarshal([]byte(res6), &mal1); err != nil {
fmt.Println("null Unmarshal err:", err)
} else {
fmt.Printf("null Unmarshal Marshaler: %+v
", mal1)
}
if err := jsoniter.Unmarshal([]byte(res6), &t4); err != nil {
fmt.Println("null Unmarshal err:", err)
} else {
fmt.Printf("null Unmarshal []string: %+v
", t4)
fmt.Println(t4 == nil)
}
}
输出:
debug截图
上一篇:
通过多线程提高代码的执行效率例子
