forked from mirror/go-json
Fix syntax error
This commit is contained in:
parent
47b7f4a5a2
commit
7421d82c43
|
@ -24,6 +24,16 @@ func newPtrDecoder(dec decoder, typ *rtype, structName, fieldName string) *ptrDe
|
||||||
func unsafe_New(*rtype) unsafe.Pointer
|
func unsafe_New(*rtype) unsafe.Pointer
|
||||||
|
|
||||||
func (d *ptrDecoder) decodeStream(s *stream, p unsafe.Pointer) error {
|
func (d *ptrDecoder) decodeStream(s *stream, p unsafe.Pointer) error {
|
||||||
|
s.skipWhiteSpace()
|
||||||
|
if s.char() == nul {
|
||||||
|
s.read()
|
||||||
|
}
|
||||||
|
if s.char() == 'n' {
|
||||||
|
if err := nullBytes(s); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
newptr := unsafe_New(d.typ)
|
newptr := unsafe_New(d.typ)
|
||||||
*(*unsafe.Pointer)(p) = newptr
|
*(*unsafe.Pointer)(p) = newptr
|
||||||
if err := d.dec.decodeStream(s, newptr); err != nil {
|
if err := d.dec.decodeStream(s, newptr); err != nil {
|
||||||
|
@ -33,6 +43,24 @@ func (d *ptrDecoder) decodeStream(s *stream, p unsafe.Pointer) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *ptrDecoder) decode(buf []byte, cursor int64, p unsafe.Pointer) (int64, error) {
|
func (d *ptrDecoder) decode(buf []byte, cursor int64, p unsafe.Pointer) (int64, error) {
|
||||||
|
cursor = skipWhiteSpace(buf, cursor)
|
||||||
|
if buf[cursor] == 'n' {
|
||||||
|
buflen := int64(len(buf))
|
||||||
|
if cursor+3 >= buflen {
|
||||||
|
return 0, errUnexpectedEndOfJSON("null", cursor)
|
||||||
|
}
|
||||||
|
if buf[cursor+1] != 'u' {
|
||||||
|
return 0, errInvalidCharacter(buf[cursor+1], "null", cursor)
|
||||||
|
}
|
||||||
|
if buf[cursor+2] != 'l' {
|
||||||
|
return 0, errInvalidCharacter(buf[cursor+2], "null", cursor)
|
||||||
|
}
|
||||||
|
if buf[cursor+3] != 'l' {
|
||||||
|
return 0, errInvalidCharacter(buf[cursor+3], "null", cursor)
|
||||||
|
}
|
||||||
|
cursor += 4
|
||||||
|
return cursor, nil
|
||||||
|
}
|
||||||
newptr := unsafe_New(d.typ)
|
newptr := unsafe_New(d.typ)
|
||||||
*(*unsafe.Pointer)(p) = newptr
|
*(*unsafe.Pointer)(p) = newptr
|
||||||
c, err := d.dec.decode(buf, cursor, newptr)
|
c, err := d.dec.decode(buf, cursor, newptr)
|
||||||
|
|
|
@ -129,6 +129,9 @@ func (s *stream) skipValue() error {
|
||||||
}
|
}
|
||||||
case ']':
|
case ']':
|
||||||
bracketCount--
|
bracketCount--
|
||||||
|
if braceCount == 0 && bracketCount == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
case ',':
|
case ',':
|
||||||
if bracketCount == 0 && braceCount == 0 {
|
if bracketCount == 0 && braceCount == 0 {
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -19,11 +19,13 @@ func newUnmarshalJSONDecoder(typ *rtype, structName, fieldName string) *unmarsha
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *unmarshalJSONDecoder) annotateError(err error) {
|
func (d *unmarshalJSONDecoder) annotateError(cursor int64, err error) {
|
||||||
ut, ok := err.(*UnmarshalTypeError)
|
switch e := err.(type) {
|
||||||
if ok {
|
case *UnmarshalTypeError:
|
||||||
ut.Struct = d.structName
|
e.Struct = d.structName
|
||||||
ut.Field = d.fieldName
|
e.Field = d.fieldName
|
||||||
|
case *SyntaxError:
|
||||||
|
e.Offset = cursor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +43,7 @@ func (d *unmarshalJSONDecoder) decodeStream(s *stream, p unsafe.Pointer) error {
|
||||||
ptr: newptr,
|
ptr: newptr,
|
||||||
}))
|
}))
|
||||||
if err := v.(Unmarshaler).UnmarshalJSON(src); err != nil {
|
if err := v.(Unmarshaler).UnmarshalJSON(src); err != nil {
|
||||||
d.annotateError(err)
|
d.annotateError(s.cursor, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
*(*unsafe.Pointer)(p) = newptr
|
*(*unsafe.Pointer)(p) = newptr
|
||||||
|
@ -51,7 +53,7 @@ func (d *unmarshalJSONDecoder) decodeStream(s *stream, p unsafe.Pointer) error {
|
||||||
ptr: p,
|
ptr: p,
|
||||||
}))
|
}))
|
||||||
if err := v.(Unmarshaler).UnmarshalJSON(src); err != nil {
|
if err := v.(Unmarshaler).UnmarshalJSON(src); err != nil {
|
||||||
d.annotateError(err)
|
d.annotateError(s.cursor, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,7 +75,7 @@ func (d *unmarshalJSONDecoder) decode(buf []byte, cursor int64, p unsafe.Pointer
|
||||||
ptr: newptr,
|
ptr: newptr,
|
||||||
}))
|
}))
|
||||||
if err := v.(Unmarshaler).UnmarshalJSON(src); err != nil {
|
if err := v.(Unmarshaler).UnmarshalJSON(src); err != nil {
|
||||||
d.annotateError(err)
|
d.annotateError(cursor, err)
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
*(*unsafe.Pointer)(p) = newptr
|
*(*unsafe.Pointer)(p) = newptr
|
||||||
|
@ -83,7 +85,7 @@ func (d *unmarshalJSONDecoder) decode(buf []byte, cursor int64, p unsafe.Pointer
|
||||||
ptr: p,
|
ptr: p,
|
||||||
}))
|
}))
|
||||||
if err := v.(Unmarshaler).UnmarshalJSON(src); err != nil {
|
if err := v.(Unmarshaler).UnmarshalJSON(src); err != nil {
|
||||||
d.annotateError(err)
|
d.annotateError(cursor, err)
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,11 +22,13 @@ func newUnmarshalTextDecoder(typ *rtype, structName, fieldName string) *unmarsha
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *unmarshalTextDecoder) annotateError(err error) {
|
func (d *unmarshalTextDecoder) annotateError(cursor int64, err error) {
|
||||||
ut, ok := err.(*UnmarshalTypeError)
|
switch e := err.(type) {
|
||||||
if ok {
|
case *UnmarshalTypeError:
|
||||||
ut.Struct = d.structName
|
e.Struct = d.structName
|
||||||
ut.Field = d.fieldName
|
e.Field = d.fieldName
|
||||||
|
case *SyntaxError:
|
||||||
|
e.Offset = cursor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,7 +48,7 @@ func (d *unmarshalTextDecoder) decodeStream(s *stream, p unsafe.Pointer) error {
|
||||||
ptr: newptr,
|
ptr: newptr,
|
||||||
}))
|
}))
|
||||||
if err := v.(encoding.TextUnmarshaler).UnmarshalText(src); err != nil {
|
if err := v.(encoding.TextUnmarshaler).UnmarshalText(src); err != nil {
|
||||||
d.annotateError(err)
|
d.annotateError(s.cursor, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
*(*unsafe.Pointer)(p) = newptr
|
*(*unsafe.Pointer)(p) = newptr
|
||||||
|
@ -69,7 +71,7 @@ func (d *unmarshalTextDecoder) decode(buf []byte, cursor int64, p unsafe.Pointer
|
||||||
ptr: *(*unsafe.Pointer)(unsafe.Pointer(&p)),
|
ptr: *(*unsafe.Pointer)(unsafe.Pointer(&p)),
|
||||||
}))
|
}))
|
||||||
if err := v.(encoding.TextUnmarshaler).UnmarshalText(src); err != nil {
|
if err := v.(encoding.TextUnmarshaler).UnmarshalText(src); err != nil {
|
||||||
d.annotateError(err)
|
d.annotateError(cursor, err)
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
return end, nil
|
return end, nil
|
||||||
|
|
2
json.go
2
json.go
|
@ -329,7 +329,7 @@ func (n Number) MarshalJSON() ([]byte, error) {
|
||||||
func (n *Number) UnmarshalJSON(b []byte) error {
|
func (n *Number) UnmarshalJSON(b []byte) error {
|
||||||
s := string(b)
|
s := string(b)
|
||||||
if _, err := strconv.ParseFloat(s, 64); err != nil {
|
if _, err := strconv.ParseFloat(s, 64); err != nil {
|
||||||
return err
|
return &SyntaxError{msg: err.Error()}
|
||||||
}
|
}
|
||||||
*n = Number(s)
|
*n = Number(s)
|
||||||
return nil
|
return nil
|
||||||
|
|
Loading…
Reference in New Issue