2016-12-14 10 views
0

私はローカルマシンにJSONファイルを保存しています。私は変数でそれを読んで、JSONオブジェクト値を取得するためにそれをループする必要があります。 ioutil.Readfileメソッドを使用してファイルを読み込んだ後でMarshalコマンドを使用すると、いくつかの数値が出力として返されます。それは私に次のエラーを与えたgolangのjsonオブジェクトとしてjsonファイルを読むにはどうすればいいですか

plan, _ := ioutil.ReadFile(filename) // filename is the JSON file to read 
var data interface{} 
err := json.Unmarshal(plan, data) 
if err != nil { 
     log.Error("Cannot unmarshal the json ", err) 
     } 
fmt.Println(data) 

time="2016-12-13T22:13:05-08:00" level=error msg="Cannot unmarshal the json json: Unmarshal(nil)" 
<nil> 

試み2:これらは私のいくつかの失敗、

試み1です私が使用して、その後、構造体でJSON値を格納しようとしましたが、 MarshalIndent

generatePlan, _ := json.MarshalIndent(plan, "", " ") // plan is a pointer to a struct 
fmt.Println(string(generatePlan)) 

出力を文字列で返します。しかし、出力を文字列にキャストすると、JSONオブジェクトとしてループすることができなくなります。

golangでJSONファイルをJSONオブジェクトとして読み取るにはどうすればよいですか?それは可能ですか? 何か助けていただければ幸いです。前もって感謝します!

答えて

6

json.Unmarshalによって設定される値はポインタである必要があります。 GoDocから

:。

非整列化は、JSONエンコードされたデータを解析し、値で結果をvによってを指摘格納

だから、あなたが次の操作を行う必要があります。

plan, _ := ioutil.ReadFile(filename) 
var data interface{} 
err := json.Unmarshal(plan, &data) 

あなたのエラー(Unmarshal(nil))は、読み込みに問題があることを示しています電子ファイルは、また、アンマーシャリングで空のインターフェイスを使用しているとき、あなたはプリミティブ型を行くように基礎となる値を取得するためにtype assertionを使用する必要がありますので予めご了承くださいioutil.ReadFile


によって返されたエラーを確認してください。インタフェース値のインタフェース値に非整列化JSONへ

、 の非整列化店舗1これら:

bool, for JSON booleans 
float64, for JSON numbers 
string, for JSON strings 
[]interface{}, for JSON arrays 
map[string]interface{}, for JSON objects 
nil for JSON null 

あなたのJSONを投入するためにコンクリート構造物を使用することが常により良いアプローチですUnmarshalを使用してください。

関連する問題