我想解组string包含JSON的a,但是该Unmarshal函数将a []byte作为输入。
string
Unmarshal
[]byte
如何将UTF8转换string为[]byte?
这个问题可能是如何将字符串分配给bytes数组的重复,但是仍然有答案,因为有更好的替代解决方案:
从转换string到[]byte由该规范允许的,使用一个简单的转换:
字符串类型之间的转换 […] 将字符串类型的值转换为字节片的类型会产生一个片,其连续元素是字符串的字节。
字符串类型之间的转换
[…]
因此,您可以简单地执行以下操作:
s := "some text" b := []byte(s) // b is of type []byte
但是,该string => []byte转换会复制字符串内容(它必须复制,因为strings是不可变的,而[]byte值不是固定的),并且在strings 大的情况下效率不高。相反,您可以创建一个io.Reader使用方法strings.NewReader(),该方法将从传递的内容中读取内容,而string无需进行复制。您可以使用以下方法将此传递io.Reader给json.NewDecoder()并解组Decoder.Decode():
string => []byte
io.Reader
strings.NewReader()
json.NewDecoder()
Decoder.Decode()
s := `{"somekey":"somevalue"}` var result interface{} err := json.NewDecoder(strings.NewReader(s)).Decode(&result) fmt.Println(result, err)
输出(在Go Playground上尝试):
map[somekey:somevalue] <nil>
注意:调用strings.NewReader()和json.NewDecoder()确实有一些开销,因此,如果您使用的是小型JSON文本,则可以安全地将其转换为[]byte和使用json.Unmarshal(),它不会变慢:
json.Unmarshal()
s := `{"somekey":"somevalue"}` var result interface{} err := json.Unmarshal([]byte(s), &result) fmt.Println(result, err)
输出是相同的。在Go Playground上尝试一下。
注意:如果要string通过读取一些内容io.Reader(例如文件或网络连接)来获取JSON输入,则可以将其直接传递io.Reader给json.NewDecoder(),而不必先从中读取内容。