Skip to content

Commit b37e66f

Browse files
author
Achille
authored
fix issue 26 (#27)
1 parent 4b8334c commit b37e66f

File tree

3 files changed

+17
-4
lines changed

3 files changed

+17
-4
lines changed

json/codec.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ func constructCodec(t reflect.Type, seen map[reflect.Type]*structType, canAddr b
156156
c = codec{encode: encoder.encodeString, decode: decoder.decodeString}
157157

158158
case reflect.Interface:
159-
c = codec{encode: encoder.encodeInterface, decode: constructNonEmptyInterfaceDecoderFunc(t)}
159+
c = codec{encode: encoder.encodeInterface, decode: constructMaybeEmptyInterfaceDecoderFunc(t)}
160160

161161
case reflect.Array:
162162
c = constructArrayCodec(t, seen, canAddr)
@@ -711,9 +711,9 @@ func constructPointerDecodeFunc(t reflect.Type, decode decodeFunc) decodeFunc {
711711
}
712712
}
713713

714-
func constructNonEmptyInterfaceDecoderFunc(t reflect.Type) decodeFunc {
714+
func constructMaybeEmptyInterfaceDecoderFunc(t reflect.Type) decodeFunc {
715715
return func(d decoder, b []byte, p unsafe.Pointer) ([]byte, error) {
716-
return d.decodeNonEmptyInterface(b, p, t)
716+
return d.decodeMaybeEmptyInterface(b, p, t)
717717
}
718718
}
719719

json/decode.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1087,7 +1087,7 @@ func (d decoder) decodeInterface(b []byte, p unsafe.Pointer) ([]byte, error) {
10871087
return b, nil
10881088
}
10891089

1090-
func (d decoder) decodeNonEmptyInterface(b []byte, p unsafe.Pointer, t reflect.Type) ([]byte, error) {
1090+
func (d decoder) decodeMaybeEmptyInterface(b []byte, p unsafe.Pointer, t reflect.Type) ([]byte, error) {
10911091
if hasNullPrefix(b) {
10921092
*(*interface{})(p) = nil
10931093
return b[4:], nil
@@ -1097,6 +1097,8 @@ func (d decoder) decodeNonEmptyInterface(b []byte, p unsafe.Pointer, t reflect.T
10971097
if e := x.Elem(); e.Kind() == reflect.Ptr {
10981098
return Parse(b, e.Interface(), d.flags)
10991099
}
1100+
} else if t.NumMethod() == 0 { // empty interface
1101+
return Parse(b, (*interface{})(p), d.flags)
11001102
}
11011103

11021104
return d.decodeUnmarshalTypeError(b, p, t)

json/json_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1464,3 +1464,14 @@ func TestGithubIssue23(t *testing.T) {
14641464
}
14651465
})
14661466
}
1467+
1468+
func TestGithubIssue26(t *testing.T) {
1469+
type interfaceType interface{}
1470+
1471+
var value interfaceType
1472+
var data = []byte(`{}`)
1473+
1474+
if err := Unmarshal(data, &value); err != nil {
1475+
t.Error(err)
1476+
}
1477+
}

0 commit comments

Comments
 (0)