@@ -153,6 +153,10 @@ func (dec *Decoder) refill() error {
153
153
dec .scanp = 0
154
154
}
155
155
156
+ return dec .refill0 ()
157
+ }
158
+
159
+ func (dec * Decoder ) refill0 () error {
156
160
// Grow buffer if not large enough.
157
161
const minRead = 512
158
162
if cap (dec .buf )- len (dec .buf ) < minRead {
@@ -402,15 +406,14 @@ func (dec *Decoder) Token() (Token, error) {
402
406
return Delim ('{' ), nil
403
407
404
408
case '}' :
405
- if dec .tokenState != tokenObjectStart && dec .tokenState != tokenObjectComma {
409
+ if dec .tokenState != tokenObjectStart && dec .tokenState != tokenObjectComma && dec . tokenState != tokenObjectKey {
406
410
return dec .tokenError (c )
407
411
}
408
412
dec .scanp ++
409
413
dec .tokenState = dec .tokenStack [len (dec .tokenStack )- 1 ]
410
414
dec .tokenStack = dec .tokenStack [:len (dec .tokenStack )- 1 ]
411
415
dec .tokenValueEnd ()
412
416
return Delim ('}' ), nil
413
-
414
417
case ':' :
415
418
if dec .tokenState != tokenObjectColon {
416
419
return dec .tokenError (c )
@@ -483,7 +486,26 @@ func (dec *Decoder) tokenError(c byte) (Token, error) {
483
486
// current array or object being parsed.
484
487
func (dec * Decoder ) More () bool {
485
488
c , err := dec .peek ()
486
- return err == nil && c != ']' && c != '}'
489
+ // return err == nil && c != ']' && c != '}'
490
+ if err != nil {
491
+ return false
492
+ }
493
+ if c == ']' || c == '}' {
494
+ return false
495
+ }
496
+ if c == ',' {
497
+ scanp := dec .scanp
498
+ dec .scanp ++
499
+ c , err = dec .peekNoRefill ()
500
+ dec .scanp = scanp
501
+ if err != nil {
502
+ return false
503
+ }
504
+ if c == ']' || c == '}' {
505
+ return false
506
+ }
507
+ }
508
+ return true
487
509
}
488
510
489
511
func (dec * Decoder ) peek () (byte , error ) {
@@ -505,6 +527,25 @@ func (dec *Decoder) peek() (byte, error) {
505
527
}
506
528
}
507
529
530
+ func (dec * Decoder ) peekNoRefill () (byte , error ) {
531
+ var err error
532
+ for {
533
+ for i := dec .scanp ; i < len (dec .buf ); i ++ {
534
+ c := dec .buf [i ]
535
+ if isSpace (c ) {
536
+ continue
537
+ }
538
+ dec .scanp = i
539
+ return c , nil
540
+ }
541
+ // buffer has been scanned, now report any error
542
+ if err != nil {
543
+ return 0 , err
544
+ }
545
+ err = dec .refill0 ()
546
+ }
547
+ }
548
+
508
549
// InputOffset returns the input stream byte offset of the current decoder position.
509
550
// The offset gives the location of the end of the most recently returned token
510
551
// and the beginning of the next token.
0 commit comments