去 - 奇怪的json连字符unmarshall错误

时间:2015-02-11 21:19:28

标签: json go

使用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整除时编码成功,例如abcdabcdefgh工作,abcde和abcdefg`不工作。

现在我知道什么是base64字符串,这个错误很有意义。参考文献:

维基百科:http://en.wikipedia.org/wiki/Base64

转换工具:http://www.string-functions.com/base64encode.aspx

2 个答案:

答案 0 :(得分:2)

来自json package文档:

  

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

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

Go Playground

答案 1 :(得分:0)

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