Commit 2db4c3d7 authored by Anthony Martin's avatar Anthony Martin Committed by Russ Cox

json: object members must have a value

R=rsc
CC=golang-dev
https://golang.org/cl/1847050
parent 3ab7830d
...@@ -37,6 +37,9 @@ var unmarshalTests = []unmarshalTest{ ...@@ -37,6 +37,9 @@ var unmarshalTests = []unmarshalTest{
unmarshalTest{"null", new(interface{}), nil, nil}, unmarshalTest{"null", new(interface{}), nil, nil},
unmarshalTest{`{"X": [1,2,3], "Y": 4}`, new(T), T{Y: 4}, &UnmarshalTypeError{"array", reflect.Typeof("")}}, unmarshalTest{`{"X": [1,2,3], "Y": 4}`, new(T), T{Y: 4}, &UnmarshalTypeError{"array", reflect.Typeof("")}},
// syntax errors
unmarshalTest{`{"X": "foo", "Y"}`, nil, nil, SyntaxError("invalid character '}' after object key")},
// composite tests // composite tests
unmarshalTest{allValueIndent, new(All), allValue, nil}, unmarshalTest{allValueIndent, new(All), allValue, nil},
unmarshalTest{allValueCompact, new(All), allValue, nil}, unmarshalTest{allValueCompact, new(All), allValue, nil},
...@@ -75,7 +78,12 @@ func TestUnmarshal(t *testing.T) { ...@@ -75,7 +78,12 @@ func TestUnmarshal(t *testing.T) {
for i, tt := range unmarshalTests { for i, tt := range unmarshalTests {
in := []byte(tt.in) in := []byte(tt.in)
if err := checkValid(in, &scan); err != nil { if err := checkValid(in, &scan); err != nil {
t.Errorf("#%d: checkValid: %v", i, err) if !reflect.DeepEqual(err, tt.err) {
t.Errorf("#%d: checkValid: %v", i, err)
continue
}
}
if tt.ptr == nil {
continue continue
} }
// v = new(right-type) // v = new(right-type)
......
...@@ -251,6 +251,8 @@ func stateBeginStringOrEmpty(s *scanner, c int) int { ...@@ -251,6 +251,8 @@ func stateBeginStringOrEmpty(s *scanner, c int) int {
return scanSkipSpace return scanSkipSpace
} }
if c == '}' { if c == '}' {
n := len(s.parseState)
s.parseState[n-1] = parseObjectValue
return stateEndValue(s, c) return stateEndValue(s, c)
} }
return stateBeginString(s, c) return stateBeginString(s, c)
...@@ -289,10 +291,6 @@ func stateEndValue(s *scanner, c int) int { ...@@ -289,10 +291,6 @@ func stateEndValue(s *scanner, c int) int {
s.step = stateBeginValue s.step = stateBeginValue
return scanObjectKey return scanObjectKey
} }
if c == '}' {
s.popParseState()
return scanEndObject
}
return s.error(c, "after object key") return s.error(c, "after object key")
case parseObjectValue: case parseObjectValue:
if c == ',' { if c == ',' {
......
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