2017-01-04 3 views
0

Я хочу, чтобы unmarshal string, который содержит JSON, , однако функция Unmarshal принимает входной сигнал []byte.Как преобразовать строку utf8 в [] byte?

Как я могу конвертировать UTF8 string в []byte?

+2

http://stackoverflow.com/a/40384408/1975086 Вы делаете '[] байт (ы)' –

+1

Уже ответил здесь - http: // stackoverflow.ком/вопросы/8032170/как к правопреемнику-струнные к байтам-массиву –

ответ

10

Этот вопрос является возможным дубликатом How to assign string to bytes array, но все-таки ответить на него, как есть лучше, альтернативное решение:

Преобразование из string в []byte допускается в спецификации, используя простой conversion:

Конверсия и из строкового типа

[...]

  1. Преобразование значения типа строки в кусок типа байтов дает срез, последующие элементы которого являются байтами строки.

Таким образом, вы можете просто сделать:

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(), без необходимости читать содержимое из него первым.

1

просто используйте [] байт (ы) на строке. например:

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.