ローカルマシンに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オブジェクトとして読み取るにはどうすればよいですか?それは可能ですか?どんな助けも大歓迎です。前もって感謝します!
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を作成するために、具体的な構造を使用することは常にはるかに優れたアプローチです。