Source file src/pkg/encoding/json/stream.go
1
2
3
4
5 package json
6
7 import (
8 "bytes"
9 "errors"
10 "io"
11 )
12
13
14 type Decoder struct {
15 r io.Reader
16 buf []byte
17 d decodeState
18 scan scanner
19 err error
20 }
21
22
23
24
25
26 func NewDecoder(r io.Reader) *Decoder {
27 return &Decoder{r: r}
28 }
29
30
31
32 func (dec *Decoder) UseNumber() { dec.d.useNumber = true }
33
34
35
36
37
38
39 func (dec *Decoder) Decode(v interface{}) error {
40 if dec.err != nil {
41 return dec.err
42 }
43
44 n, err := dec.readValue()
45 if err != nil {
46 return err
47 }
48
49
50
51
52 dec.d.init(dec.buf[0:n])
53 err = dec.d.unmarshal(v)
54
55
56 rest := copy(dec.buf, dec.buf[n:])
57 dec.buf = dec.buf[0:rest]
58
59 return err
60 }
61
62
63
64 func (dec *Decoder) Buffered() io.Reader {
65 return bytes.NewReader(dec.buf)
66 }
67
68
69
70 func (dec *Decoder) readValue() (int, error) {
71 dec.scan.reset()
72
73 scanp := 0
74 var err error
75 Input:
76 for {
77
78 for i, c := range dec.buf[scanp:] {
79 dec.scan.bytes++
80 v := dec.scan.step(&dec.scan, int(c))
81 if v == scanEnd {
82 scanp += i
83 break Input
84 }
85
86
87
88 if (v == scanEndObject || v == scanEndArray) && dec.scan.step(&dec.scan, ' ') == scanEnd {
89 scanp += i + 1
90 break Input
91 }
92 if v == scanError {
93 dec.err = dec.scan.err
94 return 0, dec.scan.err
95 }
96 }
97 scanp = len(dec.buf)
98
99
100
101 if err != nil {
102 if err == io.EOF {
103 if dec.scan.step(&dec.scan, ' ') == scanEnd {
104 break Input
105 }
106 if nonSpace(dec.buf) {
107 err = io.ErrUnexpectedEOF
108 }
109 }
110 dec.err = err
111 return 0, err
112 }
113
114
115 const minRead = 512
116 if cap(dec.buf)-len(dec.buf) < minRead {
117 newBuf := make([]byte, len(dec.buf), 2*cap(dec.buf)+minRead)
118 copy(newBuf, dec.buf)
119 dec.buf = newBuf
120 }
121
122
123 var n int
124 n, err = dec.r.Read(dec.buf[len(dec.buf):cap(dec.buf)])
125 dec.buf = dec.buf[0 : len(dec.buf)+n]
126 }
127 return scanp, nil
128 }
129
130 func nonSpace(b []byte) bool {
131 for _, c := range b {
132 if !isSpace(rune(c)) {
133 return true
134 }
135 }
136 return false
137 }
138
139
140 type Encoder struct {
141 w io.Writer
142 e encodeState
143 err error
144 }
145
146
147 func NewEncoder(w io.Writer) *Encoder {
148 return &Encoder{w: w}
149 }
150
151
152
153
154
155 func (enc *Encoder) Encode(v interface{}) error {
156 if enc.err != nil {
157 return enc.err
158 }
159 enc.e.Reset()
160 err := enc.e.marshal(v)
161 if err != nil {
162 return err
163 }
164
165
166
167
168
169
170
171 enc.e.WriteByte('\n')
172
173 if _, err = enc.w.Write(enc.e.Bytes()); err != nil {
174 enc.err = err
175 }
176 return err
177 }
178
179
180
181
182 type RawMessage []byte
183
184
185 func (m *RawMessage) MarshalJSON() ([]byte, error) {
186 return *m, nil
187 }
188
189
190 func (m *RawMessage) UnmarshalJSON(data []byte) error {
191 if m == nil {
192 return errors.New("json.RawMessage: UnmarshalJSON on nil pointer")
193 }
194 *m = append((*m)[0:0], data...)
195 return nil
196 }
197
198 var _ Marshaler = (*RawMessage)(nil)
199 var _ Unmarshaler = (*RawMessage)(nil)
View as plain text