Я хочу, чтобы unmarshal string
, который содержит JSON, , однако функция Unmarshal
принимает входной сигнал []byte
.Как преобразовать строку utf8 в [] byte?
Как я могу конвертировать UTF8 string
в []byte
?
Я хочу, чтобы unmarshal string
, который содержит JSON, , однако функция Unmarshal
принимает входной сигнал []byte
.Как преобразовать строку utf8 в [] byte?
Как я могу конвертировать UTF8 string
в []byte
?
Этот вопрос является возможным дубликатом 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
значения не являются), и в случае больших string
s это не эффективно. Вместо этого вы можете создать io.Reader
, используя strings.NewReader()
, который будет читать из пройденного 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)
Output (попробовать его на 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.
Примечание: если вы получаете ваш вклад JSON string
чтением некоторых io.Reader
(например, файл или сетевое соединение), вы можете напрямую передать, что io.Reader
к json.NewDecoder()
, без необходимости читать содержимое из него первым.
просто используйте [] байт (ы) на строке. например:
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.
http://stackoverflow.com/a/40384408/1975086 Вы делаете '[] байт (ы)' –
Уже ответил здесь - http: // stackoverflow.ком/вопросы/8032170/как к правопреемнику-струнные к байтам-массиву –