2017-01-04 23 views
0

JSONを含むstringの非整列化を行いたいが、Unmarshal関数の入力には[]byteが使用されます。utf8文字列を[]バイトに変換するには?

UTF8 string[]byteに変換するにはどうすればよいですか?

+2

http://stackoverflow.com/a/40384408/1975086 あなたは '[] byte(s)'を実行します –

+1

既にここで答えられています - http:// stackoverflow。com/questions/8032170/how-to-assign-string-to-bytes-array –

答えて

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変換は([]byte値がない間string sが不変であるとして、それは、しなければならない)、文字列のコンテンツのコピーを作成し、 のサイズが大きい場合は効率的ではありません。代わりに、io.Readerstrings.NewReader()を使用して作成することができます。はコピーされずに読み込まれます。

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()を呼び出すと、いくつかのオーバーヘッドを持っているので、そして、あなたはDecoder.Decode()メソッドを使用してjson.NewDecoder()とアンマーシャリングにこのio.Readerを渡すことができます小さな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を取得している場合は、あなたが直接、最初にそれからコンテンツを読まなく、json.NewDecoder()にそのio.Readerを渡すことができます。

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

関連する問題