|
|
@@ -702,7 +702,9 @@ LOOP:
|
|
|
switch state {
|
|
|
case 0:
|
|
|
state = 2
|
|
|
- // do not add sign to the slice ...
|
|
|
+ if storeBytes {
|
|
|
+ d.bs = append(d.bs, b)
|
|
|
+ }
|
|
|
b, eof = r.readn1eof()
|
|
|
continue
|
|
|
case 6: // typ = jsonNumFloat
|
|
|
@@ -715,7 +717,9 @@ LOOP:
|
|
|
case 0:
|
|
|
state = 2
|
|
|
n.neg = true
|
|
|
- // do not add sign to the slice ...
|
|
|
+ if storeBytes {
|
|
|
+ d.bs = append(d.bs, b)
|
|
|
+ }
|
|
|
b, eof = r.readn1eof()
|
|
|
continue
|
|
|
case 6: // typ = jsonNumFloat
|
|
|
@@ -981,16 +985,28 @@ func (d *jsonDecDriver) appendStringAsBytes() {
|
|
|
d.tok = b
|
|
|
}
|
|
|
|
|
|
- // handle null as a string
|
|
|
- if d.tok == 'n' {
|
|
|
- d.readStrIdx(10, 13) // ull
|
|
|
- d.bs = d.bs[:0]
|
|
|
+ if d.tok != '"' {
|
|
|
+ // d.d.errorf("json: expect char '%c' but got char '%c'", '"', d.tok)
|
|
|
+ // handle non-string scalar: null, true, false or a number
|
|
|
+ switch d.tok {
|
|
|
+ case 'n':
|
|
|
+ d.readStrIdx(10, 13) // ull
|
|
|
+ d.bs = d.bs[:0]
|
|
|
+ case 'f':
|
|
|
+ d.readStrIdx(5, 9) // alse
|
|
|
+ d.bs = d.bs[:5]
|
|
|
+ copy(d.bs, "false")
|
|
|
+ case 't':
|
|
|
+ d.readStrIdx(1, 4) // rue
|
|
|
+ d.bs = d.bs[:4]
|
|
|
+ copy(d.bs, "true")
|
|
|
+ default:
|
|
|
+ // try to parse a valid number
|
|
|
+ d.decNum(true)
|
|
|
+ }
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- if d.tok != '"' {
|
|
|
- d.d.errorf("json: expect char '%c' but got char '%c'", '"', d.tok)
|
|
|
- }
|
|
|
d.tok = 0
|
|
|
|
|
|
v := d.bs[:0]
|
|
|
@@ -1159,6 +1175,7 @@ func (d *jsonDecDriver) DecodeNaked() {
|
|
|
type JsonHandle struct {
|
|
|
textEncodingType
|
|
|
BasicHandle
|
|
|
+
|
|
|
// RawBytesExt, if configured, is used to encode and decode raw bytes in a custom way.
|
|
|
// If not configured, raw bytes are encoded to/from base64 text.
|
|
|
RawBytesExt InterfaceExt
|