1、bug描述
事先在resis中存入哈希:
HSet users 100 "<\"userId\":100,\"userPwd\":\"123456\",\"userName\":\"scott\">"
创建User结构体,拥有3个字段及对应json tag
type User struct {
UserId int `json:"userId"`
UserPwd string `json:"userPwd"`
UserName string `json:"userName"`
}
通过查询redis得到这个user的哈希value为res,为string类型“<\"userId\":100,\"userPwd\":\"123456\",\"userName\":\"scott\">"
我在把这个字符串转成[]byte后使用json.Unmarshal()来反序列化,把解析后的数据赋给user实例
user = &User{}
err = json.Unmarshal([]byte(res), user)
if err != nil {
fmt.Println("json.Unmarshal([]byte(res), user)出错 err=", err)
}
运行后提示json.Unmarshal([]byte(res), user)出错 err= invalid character '<' looking for beginning of value
2、bug分析
出错可能在这几个方面:
1)User结构体字段的json tag与写到redis哈希里value的字段名称不同
2)string类型的res转[]byte出错
3)json.Unmarshal操作遇到了编解码的问题
3、问题排查与定位
检查代码和redis的哈希排除了情况1),接下来考虑情况2)
打印出res和[]byte(res)分别为:
<"userId":100,"userPwd":"123456","userName":"scott">
[60 34 117 115 101 114 73 100 34 58 49 48 48 44 34 117 115 101 114 80 119 100 34 58 34 49 50 51 52 53 54 34 44 34 117 115 101 114 78 97 109 101 34 58 34 115 99 111 116 116 34 62]
找到ASCII码对照表(json使用utf-8进行编解码,而utf-8把ACSII码都囊括进去了)
res字符串第一个字符是<,对应的ASCII十进制数字正是60。随后一一检查其余字符也是完全对应的。至此排除了情况2),考虑情况3)。检索此bug解决办法时,看到有网友提到类似问题是utf-8的BOM导致的,可以在Goland中更改相关设置,我检查了下我自己的设置也没有问题
3、问题解决
在排查问题时我忽然发现有人写进redis的哈希的value都是花括号{},而不是尖括号<>,bug报错invalid character '<' looking for beginning of value应该是解码时无法识别<。所以我改了花括号,结果显示没有bug了。
4、原因总结文章来源:https://www.toymoban.com/news/detail-679878.html
json编解码格式不熟悉,还需要多多观察和使用文章来源地址https://www.toymoban.com/news/detail-679878.html
到了这里,关于Golang做项目遇到bug invalid character ‘<‘ looking for beginning of value的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!