昨天在测试一个小游戏登录模块功能的时候,编写一个json绑定的映射。一般在反序列化的时候会加上错误判断这也变成了习惯性的动作。但随后发现对这种判断还存在一些误解的地方。
看以下的代码说明。
package main
import (
"fmt"
"encoding/json"
)
type LoginVo struct{
Openid string `json:"openid"`
InviteId int `json:"inviteid"`
}
func main() {
fmt.Println("Hello, World!")
var jsonStr = []byte(`{"openid":"asdasa","inviteid":0}`)
var loginvo LoginVo
err := json.Unmarshal(jsonStr,&loginvo)
if err!=nil{
fmt.Println("error:",err)
}
fmt.Printf("%+v",loginvo)
}
//以下是输出结果
Hello, World!
{Openid:asdasa InviteId:0}
正常情况下,这个绑定的结果和预期符合。LoginVo的值通过序列化赋值进来。
但随后因为测试日志功能,故意把json的一段代码字段调整。将原先的openid值更改一下。
var jsonStr = []byte(`{"openid2":"asdasa","inviteid2":0}`)
测试的结果如下:
Hello, World!
{Openid: InviteId:0}
代码依旧可以通过,但并没有发生抛出错误。这个时候就觉得奇怪
继续把json的字符串调整非法json结构的时候,故意不加逗号
var jsonStr = []byte(`{"openid2":"asdasa""inviteid2":0}`)
编译后,会输出日志错误
Hello, World!
error: invalid character '"' after object key:value pair
{Openid: InviteId:0}
实际上,通过以上测试,一直误以为json.Unmarshal 操作的时候,将结构体loginVo映射赋值过如果不成功会抛出出错,事实上并不是。正常的json字符串,通过反序列化后依旧可以不抛出错误,只是说没有正常赋值给需要的结构体。
err := json.Unmarshal(jsonStr,&loginvo)
最后想当然以为通过序列化可以判断这个值是否有效,看来还要判断一下这个结构体的值是否为空才能判断。
package main
import (
"fmt"
"encoding/json"
)
type LoginVo struct{
Openid string `json:"openid"`
InviteId int `json:"inviteid"`
}
func main() {
fmt.Println("Hello, World!")
var jsonStr = []byte(`{"openid2":"asdasa","inviteid2":0}`)
var loginvo LoginVo
err := json.Unmarshal(jsonStr,&loginvo)
if err!=nil{
fmt.Println("error:",err)
}
if loginvo.Openid ==""{
fmt.Println("error:Openid 不能为空",)
}
fmt.Printf("%+v",loginvo)
}
不知道还有没有存在其他的坑呢