1
0
mirror of https://github.com/golang/go synced 2024-10-03 09:21:21 -06:00

json: fix array -> non-array decoding

Fixes #773.

R=adg
CC=golang-dev
https://golang.org/cl/1120042
This commit is contained in:
Russ Cox 2010-05-11 14:38:55 -07:00
parent 916426ea76
commit 4e5bc6a8fe
2 changed files with 30 additions and 19 deletions

View File

@ -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)

View File

@ -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) {