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

Go-奇怪的json连字符解组错误,json,go,Json,Go,在处理json字符串时,我遇到了一个非常奇怪的错误。当我将字符串的键值对添加到json输入时,首先引入了这个问题,它是“DeviceIdentifier”:“device id”。我将代码缩减到显示错误所需的最小值。当我几乎更改了关于键值对中数据的任何内容时,错误就消失了,这对我来说很奇怪。我可以使用其他键来规避错误,但这里似乎缺少了一些东西。要么这样,要么库函数似乎有问题。。。有什么想法吗 package main import ( "encoding/json" "fmt"

在处理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())
    }
}
前往游乐场连结:

Json包文档:

更新

我刚刚发现,当值字符串的长度可被4整除时,编码成功,例如
abcd
abcdefgh
工作,而
abcde
和abcdefg`不工作

现在我知道base64字符串是什么了,这个错误很有意义。此处的参考资料:

维基百科:

转换工具:

来自文档:

数组和切片值编码为JSON数组,但[]字节除外 编码为base64编码字符串,nil片编码为 空JSON对象

因此,如果您将结构更改为
DeviceIdentifier string
,它将起作用


请注意另一种可能性,为了将struct字段保持为
[]字节
,只需在客户端实际执行base64编码即可,这样通过json传递的值表示base64中的有效内容。这就是我在项目中最终使用的解决方案。Go中的
json.marshall()
函数会自动为包含字节片的结构执行此操作。

…和
-
不是base64编码字符串中的有效字符。因此,当
Unmarshal
到达一个字节片并尝试对其进行取消编码(假设其base64)时,它将失败。使用字符串是解决该问题的有效方法,但在应用程序的其他地方对我来说很不方便,因为我将不得不进行转换,这很好,但看起来有点混乱。我读过一些关于连字符的东西,但我也可以在没有连字符的情况下重现错误:这让我觉得问题比这更严重。根据我上面的更新,base64编码字符串问题确实是问题的根源。我在客户端实现了这种编码,解决了这个问题。谢谢