web-dev-qa-db-ja.com

golangでjsonファイルをjsonオブジェクトとして読み取るにはどうすればよいですか

ローカルマシンにJSONファイルを保存しています。変数でそれを読み取り、ループしてJSONオブジェクト値を取得する必要があります。 ioutil.Readfileメソッドを使用してファイルを読み取った後にMarshalコマンドを使用すると、出力としていくつかの数値が表示されます。これらは私の失敗したいくつかの試みです。

試行1:

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:JSON値を構造体に保存してから、MarshalIndentを使用しようとしました

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

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

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

18
Aishwarya

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

GoDoc から:

UnmarshalはJSONでエンコードされたデータを解析し、結果をvが指す値pointedに保存します。

したがって、次のことを行う必要があります。

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

エラー(Unmarshal(nil))は、ファイルの読み取りに問題があることを示しています。ioutil.ReadFileによって返されるエラーを確認してください


また、非整列化で空のインターフェイスを使用する場合、 type assertion を使用して、基本値をgoプリミティブ型として取得する必要があることに注意してください。

JSONをインターフェイス値に非整列化するために、Unmarshalはインターフェイス値に次のいずれかを格納します。

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

Unmarshalを使用してJSONを作成するために、具体的な構造を使用することは常にはるかに優れたアプローチです。

28
John S Perayil