英文:
How to convert utf8 string to []byte?
问题
你可以使用[]byte
函数将UTF8字符串转换为字节数组。在Go语言中,字符串是由字节数组组成的,因此可以直接将字符串转换为字节数组。以下是一个示例代码:
package main
import (
"encoding/json"
"fmt"
)
func main() {
jsonString := `{"name":"John","age":30,"city":"New York"}`
// 将UTF8字符串转换为字节数组
byteArray := []byte(jsonString)
// 使用Unmarshal函数解析JSON
var data map[string]interface{}
err := json.Unmarshal(byteArray, &data)
if err != nil {
fmt.Println("解析JSON时出错:", err)
return
}
fmt.Println(data)
}
在上面的示例中,我们首先将UTF8字符串jsonString
转换为字节数组byteArray
,然后使用Unmarshal
函数解析JSON数据。请注意,Unmarshal
函数的第二个参数是一个指向目标数据结构的指针,这里我们使用了map[string]interface{}
来解析JSON对象。
希望这可以帮助到你!如果你有任何其他问题,请随时问我。
英文:
I want to unmarshal a string
that contains JSON,
however the Unmarshal
function takes a []byte
as input.
How can I convert my UTF8 string
to []byte
?
答案1
得分: 17
这个问题可能是https://stackoverflow.com/questions/8032170/how-to-assign-string-to-bytes-array的重复问题,但还是回答一下,因为有一个更好的替代解决方案:
根据规范,可以通过简单的转换将string
转换为[]byte
:
字符串类型的转换
[...]
- 将字符串类型的值转换为字节切片类型会产生一个切片,其连续的元素是字符串的字节。
所以你可以简单地这样做:
s := "some text"
b := []byte(s) // b 的类型是 []byte
然而,string => []byte
的转换会复制字符串的内容(因为 string
是不可变的,而 []byte
值不是),对于大型字符串来说效率不高。相反,你可以使用 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()
,而不需要先从中读取内容。
英文:
This question is a possible duplicate of https://stackoverflow.com/questions/8032170/how-to-assign-string-to-bytes-array, but still answering it as there is a better, alternative solution:
Converting from string
to []byte
is allowed by the spec, using a simple conversion:
> Conversions to and from a string type
>
> [...]
>
> 4. Converting a value of a string type to a slice of bytes type yields a slice whose successive elements are the bytes of the string.
So you can simply do:
s := "some text"
b := []byte(s) // b is of type []byte
However, the string => []byte
conversion makes a copy of the string content (it has to, as string
s are immutable while []byte
values are not), and in case of large string
s it's not efficient. Instead, you can create an io.Reader
using strings.NewReader()
which will read from the passed string
without making a copy of it. And you can pass this io.Reader
to json.NewDecoder()
and unmarshal using the Decoder.Decode()
method:
s := `{"somekey":"somevalue"}`
var result interface{}
err := json.NewDecoder(strings.NewReader(s)).Decode(&result)
fmt.Println(result, err)
Output (try it on the Go Playground):
map[somekey:somevalue] <nil>
Note: calling strings.NewReader()
and json.NewDecoder()
does have some overhead, so if you're working with small JSON texts, you can safely convert it to []byte
and use json.Unmarshal()
, it won't be slower:
s := `{"somekey":"somevalue"}`
var result interface{}
err := json.Unmarshal([]byte(s), &result)
fmt.Println(result, err)
Output is the same. Try this on the Go Playground.
Note: if you're getting your JSON input string
by reading some io.Reader
(e.g. a file or a network connection), you can directly pass that io.Reader
to json.NewDecoder()
, without having to read the content from it first.
答案2
得分: 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)
}
在playground上查看这里。
英文:
just use []byte(s) on the string. for example:
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)
}
check it out on the playground here.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论