mirror of
https://github.com/golang/go
synced 2024-11-22 01:14:40 -07:00
json: fix array -> non-array decoding
Fixes #773. R=adg CC=golang-dev https://golang.org/cl/1120042
This commit is contained in:
parent
916426ea76
commit
4e5bc6a8fe
@ -304,6 +304,9 @@ func (d *decodeState) array(v reflect.Value) {
|
|||||||
av, ok := v.(reflect.ArrayOrSliceValue)
|
av, ok := v.(reflect.ArrayOrSliceValue)
|
||||||
if !ok {
|
if !ok {
|
||||||
d.saveError(&UnmarshalTypeError{"array", v.Type()})
|
d.saveError(&UnmarshalTypeError{"array", v.Type()})
|
||||||
|
d.off--
|
||||||
|
d.next()
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
sv, _ := v.(*reflect.SliceValue)
|
sv, _ := v.(*reflect.SliceValue)
|
||||||
|
@ -6,38 +6,46 @@ package json
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type T struct {
|
||||||
|
X string
|
||||||
|
Y int
|
||||||
|
}
|
||||||
|
|
||||||
type unmarshalTest struct {
|
type unmarshalTest struct {
|
||||||
in string
|
in string
|
||||||
ptr interface{}
|
ptr interface{}
|
||||||
out interface{}
|
out interface{}
|
||||||
|
err os.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
var unmarshalTests = []unmarshalTest{
|
var unmarshalTests = []unmarshalTest{
|
||||||
// basic types
|
// basic types
|
||||||
unmarshalTest{`true`, new(bool), true},
|
unmarshalTest{`true`, new(bool), true, nil},
|
||||||
unmarshalTest{`1`, new(int), 1},
|
unmarshalTest{`1`, new(int), 1, nil},
|
||||||
unmarshalTest{`1.2`, new(float), 1.2},
|
unmarshalTest{`1.2`, new(float), 1.2, nil},
|
||||||
unmarshalTest{`-5`, new(int16), int16(-5)},
|
unmarshalTest{`-5`, new(int16), int16(-5), nil},
|
||||||
unmarshalTest{`"a\u1234"`, new(string), "a\u1234"},
|
unmarshalTest{`"a\u1234"`, new(string), "a\u1234", nil},
|
||||||
unmarshalTest{`"http:\/\/"`, new(string), "http://"},
|
unmarshalTest{`"http:\/\/"`, new(string), "http://", nil},
|
||||||
unmarshalTest{`"g-clef: \uD834\uDD1E"`, new(string), "g-clef: \U0001D11E"},
|
unmarshalTest{`"g-clef: \uD834\uDD1E"`, new(string), "g-clef: \U0001D11E", nil},
|
||||||
unmarshalTest{`"invalid: \uD834x\uDD1E"`, new(string), "invalid: \uFFFDx\uFFFD"},
|
unmarshalTest{`"invalid: \uD834x\uDD1E"`, new(string), "invalid: \uFFFDx\uFFFD", nil},
|
||||||
unmarshalTest{"null", new(interface{}), nil},
|
unmarshalTest{"null", new(interface{}), nil, nil},
|
||||||
|
unmarshalTest{`{"X": [1,2,3], "Y": 4}`, new(T), T{Y: 4}, &UnmarshalTypeError{"array", reflect.Typeof("")}},
|
||||||
|
|
||||||
// composite tests
|
// composite tests
|
||||||
unmarshalTest{allValueIndent, new(All), allValue},
|
unmarshalTest{allValueIndent, new(All), allValue, nil},
|
||||||
unmarshalTest{allValueCompact, new(All), allValue},
|
unmarshalTest{allValueCompact, new(All), allValue, nil},
|
||||||
unmarshalTest{allValueIndent, new(*All), &allValue},
|
unmarshalTest{allValueIndent, new(*All), &allValue, nil},
|
||||||
unmarshalTest{allValueCompact, new(*All), &allValue},
|
unmarshalTest{allValueCompact, new(*All), &allValue, nil},
|
||||||
unmarshalTest{pallValueIndent, new(All), pallValue},
|
unmarshalTest{pallValueIndent, new(All), pallValue, nil},
|
||||||
unmarshalTest{pallValueCompact, new(All), pallValue},
|
unmarshalTest{pallValueCompact, new(All), pallValue, nil},
|
||||||
unmarshalTest{pallValueIndent, new(*All), &pallValue},
|
unmarshalTest{pallValueIndent, new(*All), &pallValue, nil},
|
||||||
unmarshalTest{pallValueCompact, new(*All), &pallValue},
|
unmarshalTest{pallValueCompact, new(*All), &pallValue, nil},
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMarshal(t *testing.T) {
|
func TestMarshal(t *testing.T) {
|
||||||
@ -73,8 +81,8 @@ func TestUnmarshal(t *testing.T) {
|
|||||||
// v = new(right-type)
|
// v = new(right-type)
|
||||||
v := reflect.NewValue(tt.ptr).(*reflect.PtrValue)
|
v := reflect.NewValue(tt.ptr).(*reflect.PtrValue)
|
||||||
v.PointTo(reflect.MakeZero(v.Type().(*reflect.PtrType).Elem()))
|
v.PointTo(reflect.MakeZero(v.Type().(*reflect.PtrType).Elem()))
|
||||||
if err := Unmarshal([]byte(in), v.Interface()); err != nil {
|
if err := Unmarshal([]byte(in), v.Interface()); !reflect.DeepEqual(err, tt.err) {
|
||||||
t.Errorf("#%d: %v", i, err)
|
t.Errorf("#%d: %v want %v", i, err, tt.err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if !reflect.DeepEqual(v.Elem().Interface(), tt.out) {
|
if !reflect.DeepEqual(v.Elem().Interface(), tt.out) {
|
||||||
|
Loading…
Reference in New Issue
Block a user