mirror of
https://github.com/golang/go
synced 2024-09-30 22:08:32 -06:00
encoding/json: properly unmarshal empty arrays.
The JSON unmarshaller failed to allocate an array when there are no values for the input causing the `[]` unmarshalled to []interface{} to generate []interface{}(nil) rather than []interface{}{}. This wasn't caught in the tests because Decode() works correctly and because jsonBig never generated zero-sized arrays. The modification to scanner_test.go quickly triggers the error: without the change to decoder.go, but with the change to scanner_test.go: $ go test --- FAIL: TestUnmarshalMarshal (0.10 seconds) decode_test.go:446: Marshal jsonBig scanner_test.go:206: diverge at 70: «03c1OL6$":null},{"[=» vs «03c1OL6$":[]},{"[=^\» FAIL exit status 1 FAIL encoding/json 0.266s Also added a simple regression to decode_test.go. R=adg, dave, rsc CC=golang-dev https://golang.org/cl/7196050
This commit is contained in:
parent
e6861d8c34
commit
e579395905
@ -742,7 +742,7 @@ func (d *decodeState) valueInterface() interface{} {
|
||||
|
||||
// arrayInterface is like array but returns []interface{}.
|
||||
func (d *decodeState) arrayInterface() []interface{} {
|
||||
var v []interface{}
|
||||
var v = make([]interface{}, 0)
|
||||
for {
|
||||
// Look ahead for ] - can only happen on first iteration.
|
||||
op := d.scanWhile(scanSkipSpace)
|
||||
|
@ -239,6 +239,12 @@ var unmarshalTests = []unmarshalTest{
|
||||
{in: `[1, 2, 3]`, ptr: new([1]int), out: [1]int{1}},
|
||||
{in: `[1, 2, 3]`, ptr: new([5]int), out: [5]int{1, 2, 3, 0, 0}},
|
||||
|
||||
// empty array to interface test
|
||||
{in: `[]`, ptr: new([]interface{}), out: []interface{}{}},
|
||||
{in: `null`, ptr: new([]interface{}), out: []interface{}(nil)},
|
||||
{in: `{"T":[]}`, ptr: new(map[string]interface{}), out: map[string]interface{}{"T": []interface{}{}}},
|
||||
{in: `{"T":null}`, ptr: new(map[string]interface{}), out: map[string]interface{}{"T": interface{}(nil)}},
|
||||
|
||||
// composite tests
|
||||
{in: allValueIndent, ptr: new(All), out: allValue},
|
||||
{in: allValueCompact, ptr: new(All), out: allValue},
|
||||
|
@ -277,9 +277,6 @@ func genArray(n int) []interface{} {
|
||||
if f > n {
|
||||
f = n
|
||||
}
|
||||
if n > 0 && f == 0 {
|
||||
f = 1
|
||||
}
|
||||
x := make([]interface{}, f)
|
||||
for i := range x {
|
||||
x[i] = genValue(((i+1)*n)/f - (i*n)/f)
|
||||
|
Loading…
Reference in New Issue
Block a user