Fix map key type

This commit is contained in:
Masaaki Goshima 2020-08-25 11:17:38 +09:00
parent c9f1d0043e
commit a9b9597c2e
3 changed files with 8 additions and 8 deletions

View File

@ -29,7 +29,7 @@ func (d *interfaceDecoder) numDecoder(s *stream) decoder {
var ( var (
interfaceMapType = type2rtype( interfaceMapType = type2rtype(
reflect.TypeOf((*map[interface{}]interface{})(nil)).Elem(), reflect.TypeOf((*map[string]interface{})(nil)).Elem(),
) )
) )
@ -38,12 +38,12 @@ func (d *interfaceDecoder) decodeStream(s *stream, p uintptr) error {
for { for {
switch s.char() { switch s.char() {
case '{': case '{':
var v map[interface{}]interface{} var v map[string]interface{}
ptr := unsafe.Pointer(&v) ptr := unsafe.Pointer(&v)
d.dummy = ptr d.dummy = ptr
if err := newMapDecoder( if err := newMapDecoder(
interfaceMapType, interfaceMapType,
newInterfaceDecoder(d.typ), newStringDecoder(),
newInterfaceDecoder(d.typ), newInterfaceDecoder(d.typ),
).decodeStream(s, uintptr(ptr)); err != nil { ).decodeStream(s, uintptr(ptr)); err != nil {
return err return err
@ -120,12 +120,12 @@ func (d *interfaceDecoder) decode(buf []byte, cursor int64, p uintptr) (int64, e
cursor = skipWhiteSpace(buf, cursor) cursor = skipWhiteSpace(buf, cursor)
switch buf[cursor] { switch buf[cursor] {
case '{': case '{':
var v map[interface{}]interface{} var v map[string]interface{}
ptr := unsafe.Pointer(&v) ptr := unsafe.Pointer(&v)
d.dummy = ptr d.dummy = ptr
dec := newMapDecoder( dec := newMapDecoder(
interfaceMapType, interfaceMapType,
newInterfaceDecoder(d.typ), newStringDecoder(),
newInterfaceDecoder(d.typ), newInterfaceDecoder(d.typ),
) )
cursor, err := dec.decode(buf, cursor, uintptr(ptr)) cursor, err := dec.decode(buf, cursor, uintptr(ptr))

View File

@ -204,7 +204,7 @@ func Test_Decoder(t *testing.T) {
var v interface{} var v interface{}
assertErr(t, json.Unmarshal([]byte(`{"a": 1, "b": "c"}`), &v)) assertErr(t, json.Unmarshal([]byte(`{"a": 1, "b": "c"}`), &v))
assertEq(t, "interface.kind", "map", reflect.TypeOf(v).Kind().String()) assertEq(t, "interface.kind", "map", reflect.TypeOf(v).Kind().String())
m := v.(map[interface{}]interface{}) m := v.(map[string]interface{})
assertEq(t, "interface", `1`, fmt.Sprint(m["a"])) assertEq(t, "interface", `1`, fmt.Sprint(m["a"]))
assertEq(t, "interface", `c`, fmt.Sprint(m["b"])) assertEq(t, "interface", `c`, fmt.Sprint(m["b"]))
}) })

View File

@ -108,8 +108,8 @@ func TestStructTagObjectKey(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("Unmarshal(%#q) failed: %v", b, err) t.Fatalf("Unmarshal(%#q) failed: %v", b, err)
} }
for i, v := range f.(map[interface{}]interface{}) { for i, v := range f.(map[string]interface{}) {
switch i.(string) { switch i {
case tt.key: case tt.key:
if s, ok := v.(string); !ok || s != tt.value { if s, ok := v.(string); !ok || s != tt.value {
t.Fatalf("Unexpected value: %#q, want %v", s, tt.value) t.Fatalf("Unexpected value: %#q, want %v", s, tt.value)