@@ -17,12 +17,17 @@ type decoder struct {
1717}
1818
1919func UnmarshalJSON (b []byte , v interface {}) error {
20+ rv := reflect .ValueOf (v )
21+ if rv .Kind () != reflect .Pointer || rv .IsNil () {
22+ return & json.InvalidUnmarshalError {Type : reflect .TypeOf (v )}
23+ }
24+
2025 d := & decoder {
2126 d : json .NewDecoder (bytes .NewReader (b )),
2227 b : b ,
2328 }
2429
25- err := unmarshalJSON (d , reflect . ValueOf ( v ) )
30+ err := unmarshalJSON (d , rv )
2631 if errors .Is (err , io .ErrUnexpectedEOF ) {
2732 return fmt .Errorf ("unexpected end of JSON input" )
2833 }
@@ -41,15 +46,19 @@ func NextTokenIndex(b []byte) int64 {
4146}
4247
4348func unmarshalJSON (d * decoder , v reflect.Value ) error {
44- if unmarshaler (v ) {
45- v = indirect (v , false )
49+ i2 := v .Interface ()
50+ _ = i2
51+
52+ if u , _ := indirect (v ); u != nil {
4653 p := reflect .New (v .Type ())
4754 p .Elem ().Set (v )
4855 err := d .d .Decode (p .Interface ())
4956 if err != nil {
5057 return err
5158 }
52- v .Set (p .Elem ())
59+ if v .CanSet () {
60+ v .Set (p .Elem ())
61+ }
5362 return nil
5463 }
5564
@@ -70,7 +79,7 @@ func value(token json.Token, d *decoder, v reflect.Value) error {
7079 return array (d , v )
7180 }
7281 case string :
73- v = indirect (v , false )
82+ _ , v = indirect (v )
7483 switch v .Kind () {
7584 case reflect .String :
7685 v .SetString (t )
@@ -84,7 +93,7 @@ func value(token json.Token, d *decoder, v reflect.Value) error {
8493 case float64 :
8594 return number (t , v )
8695 case bool :
87- v = indirect (v , false )
96+ _ , v = indirect (v )
8897 if v .Type ().AssignableTo (reflect .TypeOf (t )) {
8998 v .Set (reflect .ValueOf (t ))
9099 } else {
@@ -94,7 +103,6 @@ func value(token json.Token, d *decoder, v reflect.Value) error {
94103 case nil :
95104 switch v .Kind () {
96105 case reflect .Interface , reflect .Pointer , reflect .Map , reflect .Slice :
97- v = indirect (v , true )
98106 v .Set (reflect .Zero (v .Type ()))
99107 return nil
100108 default :
@@ -107,7 +115,7 @@ func value(token json.Token, d *decoder, v reflect.Value) error {
107115}
108116
109117func object (d * decoder , v reflect.Value ) error {
110- v = indirect (v , false )
118+ _ , v = indirect (v )
111119 // check type
112120 switch v .Kind () {
113121 case reflect .Struct , reflect .Map :
@@ -157,7 +165,7 @@ func object(d *decoder, v reflect.Value) error {
157165}
158166
159167func array (d * decoder , v reflect.Value ) error {
160- v = indirect (v , false )
168+ _ , v = indirect (v )
161169 isAny := false
162170 // check type
163171 switch v .Kind () {
@@ -198,7 +206,7 @@ func array(d *decoder, v reflect.Value) error {
198206 v .Set (reflect .Append (v .Elem (), p .Elem ()))
199207 } else {
200208 p := reflect .New (v .Type ().Elem ())
201- if unmarshaler (p ) {
209+ if u , _ := indirect (p ); u != nil {
202210 err = d .d .Decode (p .Interface ())
203211 if err != nil {
204212 return err
@@ -222,7 +230,7 @@ func array(d *decoder, v reflect.Value) error {
222230}
223231
224232func number (f float64 , v reflect.Value ) error {
225- v = indirect (v , false )
233+ _ , v = indirect (v )
226234 switch v .Kind () {
227235 case reflect .Int , reflect .Int8 , reflect .Int16 , reflect .Int32 , reflect .Int64 :
228236 n := int64 (f )
@@ -257,47 +265,49 @@ func number(f float64, v reflect.Value) error {
257265 return nil
258266}
259267
260- func unmarshaler (v reflect.Value ) bool {
268+ func indirect (v reflect.Value ) (json.Unmarshaler , reflect.Value ) {
269+ v0 := v
270+ haveAddr := false
271+
261272 // If v is a named type and is addressable,
262273 // start with its address, so that if the type has pointer methods,
263274 // we find them.
264275 if v .Kind () != reflect .Pointer && v .Type ().Name () != "" && v .CanAddr () {
265276 v = v .Addr ()
277+ haveAddr = true
266278 }
267279
268280 for {
269- if v .Kind () != reflect .Pointer {
270- break
271- }
272-
273- if _ , ok := v .Interface ().(json.Unmarshaler ); ok {
274- return true
275- }
276-
277- if v .IsNil () {
278- v .Set (reflect .New (v .Type ().Elem ()))
281+ // Load value from interface, but only if the result will be
282+ // usefully addressable.
283+ if v .Kind () == reflect .Interface && ! v .IsNil () {
284+ e := v .Elem ()
285+ if e .Kind () == reflect .Pointer && ! e .IsNil () {
286+ v = e
287+ continue
288+ }
279289 }
280- v = v .Elem ()
281- }
282- return false
283- }
284290
285- func indirect (v reflect.Value , isNil bool ) reflect.Value {
286- for {
287291 if v .Kind () != reflect .Pointer {
288292 break
289293 }
290294
291- if isNil && v . CanSet () {
292- break
295+ if u , ok := v . Interface ().(json. Unmarshaler ); ok {
296+ return u , v
293297 }
294298
295299 if v .IsNil () {
296300 v .Set (reflect .New (v .Type ().Elem ()))
297301 }
298- v = v .Elem ()
302+
303+ if haveAddr {
304+ v = v0 // restore original value after round-trip Value.Addr().Elem()
305+ haveAddr = false
306+ } else {
307+ v = v .Elem ()
308+ }
299309 }
300- return v
310+ return nil , v
301311}
302312
303313func getField (v reflect.Value , name string ) (reflect.Value , error ) {
0 commit comments