为了账号安全,请及时绑定邮箱和手机立即绑定

Go - 奇怪的 json 连字符解组错误

Go - 奇怪的 json 连字符解组错误

Go
慕工程0101907 2021-09-13 16:22:49
我在使用 json 字符串时遇到了一个非常奇怪的错误。当我将字符串的键值对添加到 json 输入时,首先引入了该问题,即"DeviceIdentifier": "device-id". 我将代码缩减到显示错误所需的最低限度。当我对该键值对中的数据进行几乎任何更改时,错误就会消失,这对我来说似乎很奇怪。我可以使用其他键来规避错误,但似乎我在这里遗漏了一些东西。要么是这样,要么库函数似乎有问题......有什么想法吗?package mainimport (    "encoding/json"    "fmt")type S struct {    Name            string    DeviceIdentifier []byte}func main() {    var s S    data := []byte(`{"Name": "test", "DeviceIdentifier": "device-id"}`)    if err := json.Unmarshal(data, &s); err != nil {        fmt.Println(err.Error())    }}去游乐场链接:http : //play.golang.org/p/huXuaokGikJson 包文档:http : //golang.org/pkg/encoding/json/更新我刚刚发现当值字符串的长度可以被 4 整除时,编码会成功,例如abcd并且abcdefgh有效,而abcde和 abcdefg` 则不然。现在我知道什么是 base64 字符串,错误很有意义。参考这里:维基百科:http : //en.wikipedia.org/wiki/Base64转换工具:http : //www.string-functions.com/base64encode.aspx
查看完整描述

2 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

来自json 包文档:

数组和切片值编码为 JSON 数组,除了 []byte 编码为 base64 编码的字符串,而 nil 切片编码为 null JSON 对象。

所以如果你改变你的结构,DeviceIdentifier string它会起作用


查看完整回答
反对 回复 2021-09-13
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

只是要注意另一种可能性,为了将 struct 字段保持为 a []byte,它也可以很好地在客户端实际执行 base64 编码,以便通过 json 传递的值代表 base64 中有效的值。这是我最终在我的项目中使用的解决方案。json.Marshal()Go 中的函数会为包含字节切片的结构自动执行此操作。


查看完整回答
反对 回复 2021-09-13
  • 2 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信