Go言語でjsonのパースエラー
以前codeevalのjsonのパースをするというchallengeをgoでやってみたとき、以下のようなエラーがでた。
json: cannot unmarshal null into Go value of type main.Item
簡略化してるけどコードは以下の通り。
package main import ( "encoding/json" "log" ) var d = []byte(`{ "Items":[{"id": 1},{"id": 2}, null]}`) type Item struct { Id int } type jsonobj struct { Items []Item } func main() { var data jsonobj err := json.Unmarshal(d, &data) if err != nil { log.Fatal(err) } }
ローカルで実行していると発生せず、codeevalにpostすると上記のエラーになったのでちょっと混乱した。
ググってみるとバージョンによって、nullがjsonに含まれていると扱い方によってはエラーになるらしい。
json parsing of int64 in go; null values - Stack Overflow
ローカルではgo1.2だったが、codeevalで実行されるgoはgo1だった。
バージョンは以下のコードでわかる。
package main import "fmt" import "runtime" func main() { fmt.Println(runtime.Version()) }
go1
以下のようにItemsをItemのポインタの配列にすればgo1でもエラーにならない
package main import ( "encoding/json" "log" ) var d = []byte(`{ "Items":[{"id": 1},{"id": 2}, null]}`) type Item struct { Id int } type jsonobj struct { Items []*Item } func main() { var data jsonobj err := json.Unmarshal(d, &data) if err != nil { log.Fatal(err) } }