stream.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. // Copyright 2010 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package json
  5. import (
  6. "bytes"
  7. "errors"
  8. "io"
  9. )
  10. // A Decoder reads and decodes JSON objects from an input stream.
  11. type Decoder struct {
  12. r io.Reader
  13. buf []byte
  14. d decodeState
  15. scan Scanner
  16. err error
  17. }
  18. // NewDecoder returns a new decoder that reads from r.
  19. //
  20. // The decoder introduces its own buffering and may
  21. // read data from r beyond the JSON values requested.
  22. func NewDecoder(r io.Reader) *Decoder {
  23. return &Decoder{r: r}
  24. }
  25. // UseNumber causes the Decoder to unmarshal a number into an interface{} as a
  26. // Number instead of as a float64.
  27. func (dec *Decoder) UseNumber() { dec.d.useNumber = true }
  28. // Decode reads the next JSON-encoded value from its
  29. // input and stores it in the value pointed to by v.
  30. //
  31. // See the documentation for Unmarshal for details about
  32. // the conversion of JSON into a Go value.
  33. func (dec *Decoder) Decode(v interface{}) error {
  34. if dec.err != nil {
  35. return dec.err
  36. }
  37. n, err := dec.readValue()
  38. if err != nil {
  39. return err
  40. }
  41. // Don't save err from unmarshal into dec.err:
  42. // the connection is still usable since we read a complete JSON
  43. // object from it before the error happened.
  44. dec.d.init(dec.buf[0:n])
  45. err = dec.d.unmarshal(v)
  46. // Slide rest of data down.
  47. rest := copy(dec.buf, dec.buf[n:])
  48. dec.buf = dec.buf[0:rest]
  49. return err
  50. }
  51. // Buffered returns a reader of the data remaining in the Decoder's
  52. // buffer. The reader is valid until the next call to Decode.
  53. func (dec *Decoder) Buffered() io.Reader {
  54. return bytes.NewReader(dec.buf)
  55. }
  56. // readValue reads a JSON value into dec.buf.
  57. // It returns the length of the encoding.
  58. func (dec *Decoder) readValue() (int, error) {
  59. dec.scan.Reset()
  60. scanp := 0
  61. var err error
  62. Input:
  63. for {
  64. // Look in the buffer for a new value.
  65. for i, c := range dec.buf[scanp:] {
  66. dec.scan.bytes++
  67. v := dec.scan.Step(&dec.scan, int(c))
  68. if v == ScanEnd {
  69. scanp += i
  70. break Input
  71. }
  72. // scanEnd is delayed one byte.
  73. // We might block trying to get that byte from src,
  74. // so instead invent a space byte.
  75. if (v == ScanEndObject || v == ScanEndArray) && dec.scan.Step(&dec.scan, ' ') == ScanEnd {
  76. scanp += i + 1
  77. break Input
  78. }
  79. if v == ScanError {
  80. dec.err = dec.scan.Err
  81. return 0, dec.scan.Err
  82. }
  83. }
  84. scanp = len(dec.buf)
  85. // Did the last read have an error?
  86. // Delayed until now to allow buffer scan.
  87. if err != nil {
  88. if err == io.EOF {
  89. if dec.scan.Step(&dec.scan, ' ') == ScanEnd {
  90. break Input
  91. }
  92. if nonSpace(dec.buf) {
  93. err = io.ErrUnexpectedEOF
  94. }
  95. }
  96. dec.err = err
  97. return 0, err
  98. }
  99. // Make room to read more into the buffer.
  100. const minRead = 512
  101. if cap(dec.buf)-len(dec.buf) < minRead {
  102. newBuf := make([]byte, len(dec.buf), 2*cap(dec.buf)+minRead)
  103. copy(newBuf, dec.buf)
  104. dec.buf = newBuf
  105. }
  106. // Read. Delay error for next iteration (after scan).
  107. var n int
  108. n, err = dec.r.Read(dec.buf[len(dec.buf):cap(dec.buf)])
  109. dec.buf = dec.buf[0 : len(dec.buf)+n]
  110. }
  111. return scanp, nil
  112. }
  113. func nonSpace(b []byte) bool {
  114. for _, c := range b {
  115. if !isSpace(rune(c)) {
  116. return true
  117. }
  118. }
  119. return false
  120. }
  121. // An Encoder writes JSON objects to an output stream.
  122. type Encoder struct {
  123. w io.Writer
  124. err error
  125. }
  126. // NewEncoder returns a new encoder that writes to w.
  127. func NewEncoder(w io.Writer) *Encoder {
  128. return &Encoder{w: w}
  129. }
  130. // Encode writes the JSON encoding of v to the stream,
  131. // followed by a newline character.
  132. //
  133. // See the documentation for Marshal for details about the
  134. // conversion of Go values to JSON.
  135. func (enc *Encoder) Encode(v interface{}) error {
  136. if enc.err != nil {
  137. return enc.err
  138. }
  139. e := newEncodeState()
  140. err := e.marshal(v)
  141. if err != nil {
  142. return err
  143. }
  144. // Terminate each value with a newline.
  145. // This makes the output look a little nicer
  146. // when debugging, and some kind of space
  147. // is required if the encoded value was a number,
  148. // so that the reader knows there aren't more
  149. // digits coming.
  150. e.WriteByte('\n')
  151. if _, err = enc.w.Write(e.Bytes()); err != nil {
  152. enc.err = err
  153. }
  154. encodeStatePool.Put(e)
  155. return err
  156. }
  157. // RawMessage is a raw encoded JSON object.
  158. // It implements Marshaler and Unmarshaler and can
  159. // be used to delay JSON decoding or precompute a JSON encoding.
  160. type RawMessage []byte
  161. // MarshalJSON returns *m as the JSON encoding of m.
  162. func (m *RawMessage) MarshalJSON() ([]byte, error) {
  163. return *m, nil
  164. }
  165. // UnmarshalJSON sets *m to a copy of data.
  166. func (m *RawMessage) UnmarshalJSON(data []byte) error {
  167. if m == nil {
  168. return errors.New("json.RawMessage: UnmarshalJSON on nil pointer")
  169. }
  170. *m = append((*m)[0:0], data...)
  171. return nil
  172. }
  173. var _ Marshaler = (*RawMessage)(nil)
  174. var _ Unmarshaler = (*RawMessage)(nil)