我想要解组包含JSON的string
,
但是Unmarshal
函数需要[]byte
作为输入。
如何将我的UTF8 string
转换为[]byte
?
答案 0 :(得分:10)
这个问题可能与How to assign string to bytes array重复,但仍在回答,因为有更好的替代解决方案:
规范允许从string
转换为[]byte
,使用简单的conversion:
来自字符串类型的转化
[...]
- 将字符串类型的值转换为字节切片类型会产生一个切片,其连续元素是字符串的字节。
醇>
所以你可以这样做:
s := "some text"
b := []byte(s) // b is of type []byte
但是,string => []byte
转换会生成字符串内容的副本(因为string
s是不可变的,而[]byte
值不是),并且在大的情况下{ {1}}它效率不高。相反,您可以使用io.Reader
创建strings.NewReader()
,该json.NewDecoder()
将从传递的string
中读取,而不会复制它。您可以使用Decoder.Decode()
方法将此string
传递给Go Playground并解组:
io.Reader
输出(在json.Unmarshal()
上尝试):
s := `{"somekey":"somevalue"}`
var result interface{}
err := json.NewDecoder(strings.NewReader(s)).Decode(&result)
fmt.Println(result, err)
注意:调用map[somekey:somevalue] <nil>
和strings.NewReader()
会产生一些开销,因此如果您使用的是小型JSON文本,则可以安全地将其转换为json.NewDecoder()
并使用{{3} },它不会慢:
[]byte
输出是一样的。请在Go Playground上尝试此操作。
注意:如果您通过阅读一些s := `{"somekey":"somevalue"}`
var result interface{}
err := json.Unmarshal([]byte(s), &result)
fmt.Println(result, err)
(例如文件或网络连接)获得JSON输入string
,则可以直接将io.Reader
传递给{{1无需先读取内容。
答案 1 :(得分:1)
只需在字符串上使用[] 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)
}
在操场here上查看。