Skip to content

Commit bea8641

Browse files
authored
Merge pull request #44 from Basekick-Labs/fix/nested-map-integer-keys
fix(decode): use interface{} value type for non-string-keyed maps (#20)
2 parents 91af8d8 + 33e0ede commit bea8641

2 files changed

Lines changed: 28 additions & 2 deletions

File tree

decode_map.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,13 +255,14 @@ func (d *Decoder) decodeTypedMapN(n int) (interface{}, error) {
255255
}
256256

257257
keyType := reflect.TypeOf(key)
258-
valueType := reflect.TypeOf(value)
259258

260259
if !keyType.Comparable() {
261260
return nil, fmt.Errorf("msgpack: unsupported map key: %s", keyType.String())
262261
}
263262

264-
mapType := reflect.MapOf(keyType, valueType)
263+
// Use interface{} as the value type so heterogeneous values (e.g.
264+
// nested maps with different inner types) decode without type errors.
265+
mapType := reflect.MapOf(keyType, interfaceType)
265266

266267
ln := n
267268
if d.flags&disableAllocLimitFlag == 0 {

types_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1246,6 +1246,31 @@ func TestFloat64(t *testing.T) {
12461246
}
12471247
}
12481248

1249+
func TestNestedMapIntegerKeys(t *testing.T) {
1250+
// Issue #20: nested maps with integer keys should round-trip through interface{}.
1251+
m := map[int]map[int]interface{}{
1252+
1: {10: "hello", 20: 42},
1253+
}
1254+
b, err := msgpack.Marshal(m)
1255+
require.NoError(t, err)
1256+
1257+
var out interface{}
1258+
require.NoError(t, msgpack.Unmarshal(b, &out))
1259+
require.NotNil(t, out)
1260+
1261+
// Also test heterogeneous inner values across outer entries.
1262+
m2 := map[int]map[int]interface{}{
1263+
1: {10: "hello"},
1264+
2: {20: 42},
1265+
}
1266+
b2, err := msgpack.Marshal(m2)
1267+
require.NoError(t, err)
1268+
1269+
var out2 interface{}
1270+
require.NoError(t, msgpack.Unmarshal(b2, &out2))
1271+
require.NotNil(t, out2)
1272+
}
1273+
12491274
func mustParseTime(format, s string) time.Time {
12501275
tm, err := time.Parse(format, s)
12511276
if err != nil {

0 commit comments

Comments
 (0)