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)
	}
}


関連 : Go言語でCodeEvalのJSON Menu IDs - brainstorm