Go-奇怪的json连字符解组错误
在处理json字符串时,我遇到了一个非常奇怪的错误。当我将字符串的键值对添加到json输入时,首先引入了这个问题,它是Go-奇怪的json连字符解组错误,json,go,Json,Go,在处理json字符串时,我遇到了一个非常奇怪的错误。当我将字符串的键值对添加到json输入时,首先引入了这个问题,它是“DeviceIdentifier”:“device id”。我将代码缩减到显示错误所需的最小值。当我几乎更改了关于键值对中数据的任何内容时,错误就消失了,这对我来说很奇怪。我可以使用其他键来规避错误,但这里似乎缺少了一些东西。要么这样,要么库函数似乎有问题。。。有什么想法吗 package main import ( "encoding/json" "fmt"
“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())
}
}
前往游乐场连结:
Json包文档:
更新
我刚刚发现,当值字符串的长度可被4整除时,编码成功,例如abcd
和abcdefgh
工作,而abcde
和abcdefg`不工作
现在我知道base64字符串是什么了,这个错误很有意义。此处的参考资料:
维基百科:
转换工具:来自文档:
数组和切片值编码为JSON数组,但[]字节除外
编码为base64编码字符串,nil片编码为
空JSON对象
因此,如果您将结构更改为DeviceIdentifier string
,它将起作用
请注意另一种可能性,为了将struct字段保持为
[]字节
,只需在客户端实际执行base64编码即可,这样通过json传递的值表示base64中的有效内容。这就是我在项目中最终使用的解决方案。Go中的json.marshall()
函数会自动为包含字节片的结构执行此操作。…和-
不是base64编码字符串中的有效字符。因此,当Unmarshal
到达一个字节片并尝试对其进行取消编码(假设其base64)时,它将失败。使用字符串是解决该问题的有效方法,但在应用程序的其他地方对我来说很不方便,因为我将不得不进行转换,这很好,但看起来有点混乱。我读过一些关于连字符的东西,但我也可以在没有连字符的情况下重现错误:这让我觉得问题比这更严重。根据我上面的更新,base64编码字符串问题确实是问题的根源。我在客户端实现了这种编码,解决了这个问题。谢谢