package json import ( "net/http" json "github.com/json-iterator/go" "bytes" "io" "errors" ) var ( jsonContentType = []string{"application/json; charset=utf-8"} JSONConfig = json.ConfigFastest errorJsonEncoderEmpty = errors.New("empty json encoder") ) func DumpJSON(w http.ResponseWriter, code int, serializable interface{}) { // Encode header := w.Header() if val := header["Content-Type"]; len(val) == 0 { header["Content-Type"] = jsonContentType } w.WriteHeader(code) stream := JSONConfig.BorrowStream(w) if stream == nil { panic(errorJsonEncoderEmpty) } defer JSONConfig.ReturnStream(stream) stream.WriteVal(serializable) stream.Flush() if stream.Error != nil { panic(stream.Error) } } func DumpJSONData(serializable interface{}) ([]byte, error) { buf := bytes.Buffer{} stream := JSONConfig.BorrowStream(&buf) if stream == nil { panic(errors.New("empty json encoder")) } defer JSONConfig.ReturnStream(stream) stream.WriteVal(serializable) stream.Flush() return buf.Bytes(), stream.Error } func LoadJSON(data []byte, deserializable interface{}) (err error) { iterator := JSONConfig.BorrowIterator(data) if iterator == nil { err = errors.New("empty json data") return } defer JSONConfig.ReturnIterator(iterator) iterator.ReadVal(deserializable) return iterator.Error } func LoadJSONReader(r io.Reader, deserializable interface{}) (err error) { decoder := JSONConfig.NewDecoder(r) return decoder.Decode(deserializable) }