Golang做项目遇到bug invalid character ‘<‘ looking for beginning of value

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、原因总结

json编解码格式不熟悉,还需要多多观察和使用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值