2016-11-18 11 views
0

私はtrial.goにコードスニペットを次のよう書かれている:コマンドライン入力を正しくアンマーシャルする方法は?

type Mine struct{ 
    A string `json:"a"` 
} 

func main(){ 
    s := Mine{} 
    v := os.Args[1]//`{"a":"1"}` 
    fmt.Println(v) 
    fmt.Println(reflect.TypeOf(v)) 
    json.Unmarshal([]byte(v), &s) 
    fmt.Println(s) 
} 

私は以下のように、このファイルを実行しています:

go run trial.go `{"A":"1"}` 

しかし、私はsに何かを得ることはありません。これは常に空白の構造体です。

私はここで間違っていますか?

+1

Unmarshalからエラーをチェックしてみましたか? – JimB

+0

実際には「無効な文字」のようなさまざまなエラーがありますが、オブジェクトキーの文字列の先頭を探していますが、@iczaの回答が私のために働いたと思います。私は、上記のコードスニペットをより大きい入力文字列が必要なより大きなものに使用しようとすると、コマンドライン入力が私にとって良い選択肢にはならないと感じています。私は入力を受け入れるより良い方法を見つける必要があります。 –

+0

私はあなたが( "A": "1")バックチック " –

答えて

1

json.Unmarshal()によって返される最初のチェックエラー。あなたのjsonタグ次

しかしencoding/jsonパッケージがあまりにも資本"A"を認識し、JSONのキーのような小さな"a"を使用しています。

最後に、このような引数をコマンドラインで渡すことは、OS(シェル)固有のものです。バッククォートとクォート通常、このようにそれを渡してみてください、特別な意味を持っている:

go run trial.go {\"a\":\"1\"} 

また、ユーザが任意の引数を提供していない場合は、それをインデックス付けする前にos.Argsの長さをチェックする必要がありos.Args[1]がパニックになります。

あなたが言及したように、入力JSONドキュメントをテストするもう1つの方法があります。これは、JSONテキストが大きい場合は実行不能になり、これもOS(シェル)固有のものです。より良い方法は、標準入力から読み込むか、ファイルから読み込むことです。

関連する問題