我想要将包含JSON的string
进行解组,
但是Unmarshal
函数需要一个[]byte
作为输入。
我该如何将我的UTF8 string
转换为[]byte
?
我想要将包含JSON的string
进行解组,
但是Unmarshal
函数需要一个[]byte
作为输入。
我该如何将我的UTF8 string
转换为[]byte
?
这个问题可能是如何将字符串赋值给字节数组的重复问题,但仍然回答它,因为有更好的替代解决方案:
按照规范,可以使用简单的转换将string
转换为[]byte
:
与字符串类型的转换
[...]
- 将字符串类型的值转换为字节片类型可生成一个切片,其连续的元素是字符串的字节。
所以你可以简单地这样做:
s := "some text"
b := []byte(s) // b is of type []byte
但是,string => []byte
的转换会复制字符串内容(因为 string
是不可变的,而 []byte
值不是),对于大型的 string
不够高效。相反地,您可以使用 strings.NewReader()
创建一个 io.Reader
,它将从传递的 string
中读取而不进行复制。然后,您可以将这个 io.Reader
传递给 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()
,这样不会更慢:
s := `{"somekey":"somevalue"}`
var result interface{}
err := json.Unmarshal([]byte(s), &result)
fmt.Println(result, err)
输出结果相同。在Go Playground上尝试一下。
注意:如果你通过读取某个io.Reader
(例如文件或网络连接)来获取JSON输入string
,则可以直接将该io.Reader
传递给json.NewDecoder()
,而无需先从中读取内容。
只需在字符串上使用 []byte(s)。例如:
package main
import (
"encoding/json"
"fmt"
)
func main() {
s := `{"test":"ok"}`
var data map[string]interface{}
if err := json.Unmarshal([]byte(s), &data); err != nil {
panic(err)
}
fmt.Printf("json data: %v", data)
}
在游乐场上查看这里。
[]byte(s)
。 - Alexander Trakhimenok