mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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
This commit is contained in:
parent
a22389ec38
commit
a4600126d9
2 changed files with 30 additions and 3 deletions
|
|
@ -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) {
|
||||||
} 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) {
|
||||||
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")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue