| // Copyright 2010 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package json | |
| import ( | |
| "io" | |
| "os" | |
| ) | |
| // A Decoder reads and decodes JSON objects from an input stream. | |
| type Decoder struct { | |
| r io.Reader | |
| buf []byte | |
| d decodeState | |
| scan scanner | |
| err os.Error | |
| } | |
| // NewDecoder returns a new decoder that reads from r. | |
| func NewDecoder(r io.Reader) *Decoder { | |
| return &Decoder{r: r} | |
| } | |
| // Decode reads the next JSON-encoded value from its | |
| // input and stores it in the value pointed to by v. | |
| // | |
| // See the documentation for Unmarshal for details about | |
| // the conversion of JSON into a Go value. | |
| func (dec *Decoder) Decode(v interface{}) os.Error { | |
| if dec.err != nil { | |
| return dec.err | |
| } | |
| n, err := dec.readValue() | |
| if err != nil { | |
| return err | |
| } | |
| // Don't save err from unmarshal into dec.err: | |
| // the connection is still usable since we read a complete JSON | |
| // object from it before the error happened. | |
| dec.d.init(dec.buf[0:n]) | |
| err = dec.d.unmarshal(v) | |
| // Slide rest of data down. | |
| rest := copy(dec.buf, dec.buf[n:]) | |
| dec.buf = dec.buf[0:rest] | |
| return err | |
| } | |
| // readValue reads a JSON value into dec.buf. | |
| // It returns the length of the encoding. | |
| func (dec *Decoder) readValue() (int, os.Error) { | |
| dec.scan.reset() | |
| scanp := 0 | |
| var err os.Error | |
| Input: | |
| for { | |
| // Look in the buffer for a new value. | |
| for i, c := range dec.buf[scanp:] { | |
| dec.scan.bytes++ | |
| v := dec.scan.step(&dec.scan, int(c)) | |
| if v == scanEnd { | |
| scanp += i | |
| break Input | |
| } | |
| // scanEnd is delayed one byte. | |
| // We might block trying to get that byte from src, | |
| // so instead invent a space byte. | |
| if v == scanEndObject && dec.scan.step(&dec.scan, ' ') == scanEnd { | |
| scanp += i + 1 | |
| break Input | |
| } | |
| if v == scanError { | |
| dec.err = dec.scan.err | |
| return 0, dec.scan.err | |
| } | |
| } | |
| scanp = len(dec.buf) | |
| // Did the last read have an error? | |
| // Delayed until now to allow buffer scan. | |
| if err != nil { | |
| if err == os.EOF { | |
| if dec.scan.step(&dec.scan, ' ') == scanEnd { | |
| break Input | |
| } | |
| if nonSpace(dec.buf) { | |
| err = io.ErrUnexpectedEOF | |
| } | |
| } | |
| dec.err = err | |
| return 0, err | |
| } | |
| // Make room to read more into the buffer. | |
| const minRead = 512 | |
| if cap(dec.buf)-len(dec.buf) < minRead { | |
| newBuf := make([]byte, len(dec.buf), 2*cap(dec.buf)+minRead) | |
| copy(newBuf, dec.buf) | |
| dec.buf = newBuf | |
| } | |
| // Read. Delay error for next iteration (after scan). | |
| var n int | |
| n, err = dec.r.Read(dec.buf[len(dec.buf):cap(dec.buf)]) | |
| dec.buf = dec.buf[0 : len(dec.buf)+n] | |
| } | |
| return scanp, nil | |
| } | |
| func nonSpace(b []byte) bool { | |
| for _, c := range b { | |
| if !isSpace(int(c)) { | |
| return true | |
| } | |
| } | |
| return false | |
| } | |
| // An Encoder writes JSON objects to an output stream. | |
| type Encoder struct { | |
| w io.Writer | |
| e encodeState | |
| err os.Error | |
| } | |
| // NewEncoder returns a new encoder that writes to w. | |
| func NewEncoder(w io.Writer) *Encoder { | |
| return &Encoder{w: w} | |
| } | |
| // Encode writes the JSON encoding of v to the connection. | |
| // | |
| // See the documentation for Marshal for details about the | |
| // conversion of Go values to JSON. | |
| func (enc *Encoder) Encode(v interface{}) os.Error { | |
| if enc.err != nil { | |
| return enc.err | |
| } | |
| enc.e.Reset() | |
| err := enc.e.marshal(v) | |
| if err != nil { | |
| return err | |
| } | |
| // Terminate each value with a newline. | |
| // This makes the output look a little nicer | |
| // when debugging, and some kind of space | |
| // is required if the encoded value was a number, | |
| // so that the reader knows there aren't more | |
| // digits coming. | |
| enc.e.WriteByte('\n') | |
| if _, err = enc.w.Write(enc.e.Bytes()); err != nil { | |
| enc.err = err | |
| } | |
| return err | |
| } | |
| // RawMessage is a raw encoded JSON object. | |
| // It implements Marshaler and Unmarshaler and can | |
| // be used to delay JSON decoding or precompute a JSON encoding. | |
| type RawMessage []byte | |
| // MarshalJSON returns *m as the JSON encoding of m. | |
| func (m *RawMessage) MarshalJSON() ([]byte, os.Error) { | |
| return *m, nil | |
| } | |
| // UnmarshalJSON sets *m to a copy of data. | |
| func (m *RawMessage) UnmarshalJSON(data []byte) os.Error { | |
| if m == nil { | |
| return os.NewError("json.RawMessage: UnmarshalJSON on nil pointer") | |
| } | |
| *m = append((*m)[0:0], data...) | |
| return nil | |
| } | |
| var _ Marshaler = (*RawMessage)(nil) | |
| var _ Unmarshaler = (*RawMessage)(nil) |