使用json字符串时,我遇到了一个非常奇怪的错误。当我向json输入添加一个键值对的字符串"DeviceIdentifier": "device-id"
时,首先引入了这个问题。我将我的代码减少到显示错误所需的最小值。当我改变关于该键值对中的数据的任何事情时,错误消失了,这对我来说似乎很奇怪。我可以使用其他键来规避错误,但似乎我在这里缺少一些东西。无论是图书馆功能还是图书馆功能都有问题......有什么想法吗?
package main
import (
"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/huXuaokGik
Json包文档:http://golang.org/pkg/encoding/json/
更新
我刚刚发现,当值字符串的长度可被4整除时编码成功,例如abcd
和abcdefgh
工作,abcde
和abcdefg`不工作。
现在我知道什么是base64字符串,这个错误很有意义。参考文献:
答案 0 :(得分:2)
来自json package文档:
数组和切片值编码为JSON数组,但[]字节除外 编码为base64编码的字符串,nil slice编码为 null JSON对象。
因此,如果您将结构更改为DeviceIdentifier string
,那么它将起作用
答案 1 :(得分:0)
只是要注意另一种可能性,为了将struct字段保持为[]byte
,它也可以很好地在客户端实际执行base64编码,以便通过json传递的值代表某些东西在base64中有效。这是我最终在我的项目中使用的解决方案。 Go中的json.Marshal()
函数会自动为包含字节切片的结构执行此操作。