I want to unmarshal a string
that contains JSON,
however the Unmarshal
function takes a []byte
as input.
How can I convert my UTF8
This question is a possible duplicate of 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
[...]
- 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]
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.