object (ordered) accept valid JSON array value
()
| 542 | |
| 543 | // object (ordered) accept valid JSON array value |
| 544 | func (d *Decoder) objectOrdered() (KVS, error) { |
| 545 | d.depth++ |
| 546 | |
| 547 | var ( |
| 548 | c byte |
| 549 | k string |
| 550 | v interface{} |
| 551 | t ValueType |
| 552 | err error |
| 553 | obj KVS |
| 554 | ) |
| 555 | |
| 556 | // skip allocating map if it will not be emitted |
| 557 | if d.depth > d.emitDepth { |
| 558 | obj = make(KVS, 0) |
| 559 | } |
| 560 | |
| 561 | // if the object has no keys |
| 562 | if c = d.skipSpaces(); c == '}' { |
| 563 | goto out |
| 564 | } |
| 565 | |
| 566 | scan: |
| 567 | for { |
| 568 | offset := d.pos - 1 |
| 569 | |
| 570 | // read string key |
| 571 | if c != '"' { |
| 572 | err = d.mkError(ErrSyntax, "looking for beginning of object key string") |
| 573 | break |
| 574 | } |
| 575 | if k, err = d.string(); err != nil { |
| 576 | break |
| 577 | } |
| 578 | |
| 579 | // read colon before value |
| 580 | if c = d.skipSpaces(); c != ':' { |
| 581 | err = d.mkError(ErrSyntax, "after object key") |
| 582 | break |
| 583 | } |
| 584 | |
| 585 | // read value |
| 586 | d.skipSpaces() |
| 587 | if d.emitKV { |
| 588 | if v, t, err = d.any(); err != nil { |
| 589 | break |
| 590 | } |
| 591 | if d.willEmit() { |
| 592 | d.metaCh <- &MetaValue{ |
| 593 | Offset: int(offset), |
| 594 | Length: int(d.pos - offset), |
| 595 | Depth: d.depth, |
| 596 | Value: KV{k, v}, |
| 597 | ValueType: t, |
| 598 | } |
| 599 | } |
| 600 | } else { |
| 601 | if v, err = d.emitAny(); err != nil { |