diff -r bacb4ed5791c src/pkg/json/decode.go --- a/src/pkg/json/decode.go Thu Aug 04 16:38:18 2011 +1000 +++ b/src/pkg/json/decode.go Mon Aug 22 16:54:45 2011 +1000 @@ -549,6 +549,17 @@ item := d.data[start:d.off] // Check for unmarshaler. + // first, check if we can do an immediate unmarshalling. + if v.CanAddr() { + unmarshaler, ok := v.Addr().Interface().(Unmarshaler) + if ok { + err := unmarshaler.UnmarshalJSON(item) + if err != nil { + d.error(err) + } + return + } + } wantptr := item[0] == 'n' // null unmarshaler, pv := d.indirect(v, wantptr) if unmarshaler != nil {