Commit a4600126 authored by Ryan Slade's avatar Ryan Slade Committed by Dave Cheney

encoding/json: encode map key is of string kind, decode only of string type

Allows encoding and decoding of maps with key of string kind, not just string type.
Fixes #3519.

R=rsc, dave
CC=golang-dev
https://golang.org/cl/6943047
parent a22389ec
...@@ -430,9 +430,9 @@ func (d *decodeState) object(v reflect.Value) { ...@@ -430,9 +430,9 @@ func (d *decodeState) object(v reflect.Value) {
// Check type of target: struct or map[string]T // Check type of target: struct or map[string]T
switch v.Kind() { switch v.Kind() {
case reflect.Map: case reflect.Map:
// map must have string type // map must have string kind
t := v.Type() t := v.Type()
if t.Key() != reflect.TypeOf("") { if t.Key().Kind() != reflect.String {
d.saveError(&UnmarshalTypeError{"object", v.Type()}) d.saveError(&UnmarshalTypeError{"object", v.Type()})
break break
} }
...@@ -536,10 +536,12 @@ func (d *decodeState) object(v reflect.Value) { ...@@ -536,10 +536,12 @@ func (d *decodeState) object(v reflect.Value) {
} else { } else {
d.value(subv) d.value(subv)
} }
// Write value back to map; // Write value back to map;
// if using struct, subv points into struct already. // if using struct, subv points into struct already.
if v.Kind() == reflect.Map { if v.Kind() == reflect.Map {
v.SetMapIndex(reflect.ValueOf(key), subv) kv := reflect.ValueOf(key).Convert(v.Type().Key())
v.SetMapIndex(kv, subv)
} }
// Next token must be , or }. // Next token must be , or }.
......
...@@ -1000,3 +1000,28 @@ func TestUnmarshalNulls(t *testing.T) { ...@@ -1000,3 +1000,28 @@ func TestUnmarshalNulls(t *testing.T) {
t.Errorf("Unmarshal of null values affected primitives") t.Errorf("Unmarshal of null values affected primitives")
} }
} }
func TestStringKind(t *testing.T) {
type stringKind string
type aMap map[stringKind]int
var m1, m2 map[stringKind]int
m1 = map[stringKind]int{
"foo": 42,
}
data, err := Marshal(m1)
if err != nil {
t.Errorf("Unexpected error marshalling: %v", err)
}
err = Unmarshal(data, &m2)
if err != nil {
t.Errorf("Unexpected error unmarshalling: %v", err)
}
if !reflect.DeepEqual(m1, m2) {
t.Error("Items should be equal after encoding and then decoding")
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment