RawJSON added to allow writing JSON from bytes

This commit is contained in:
Tyson Maly 2015-09-21 08:10:01 -04:00
parent febfd57e0c
commit a1329c766d
4 changed files with 35 additions and 0 deletions

View File

@ -5,6 +5,7 @@
package gin package gin
import ( import (
"bytes"
"errors" "errors"
"io" "io"
"math" "math"
@ -358,6 +359,14 @@ func (c *Context) JSON(code int, obj interface{}) {
} }
} }
// RawJSON give a buffer of bytes representing JSON just write it out
// this habdles cases where you get back JSON as bytes from redis or ffjson
// and you do not want the extra marshall/demarshal overhead
// It also sets the Content-Type as "application/json".
func (c *Context) RawJSON(code int, obj interface{}) {
c.Render(code, render.RawJSON{Data: obj.(*bytes.Buffer)})
}
// XML serializes the given struct as XML into the response body. // XML serializes the given struct as XML into the response body.
// It also sets the Content-Type as "application/xml". // It also sets the Content-Type as "application/xml".
func (c *Context) XML(code int, obj interface{}) { func (c *Context) XML(code int, obj interface{}) {

View File

@ -257,6 +257,21 @@ func TestContextRenderJSON(t *testing.T) {
assert.Equal(t, w.HeaderMap.Get("Content-Type"), "application/json; charset=utf-8") assert.Equal(t, w.HeaderMap.Get("Content-Type"), "application/json; charset=utf-8")
} }
// Tests that the response is JSON writen out from bytes
// and Content-Type is set to application/json
func TestContextRenderRawJSON(t *testing.T) {
c, w, _ := createTestContext()
var buffer bytes.Buffer
buffer.WriteString("{\"foo\": \"bar\"}")
c.RawJSON(201, &buffer)
assert.Equal(t, w.Code, 201)
assert.Equal(t, w.Body.String(), "{\"foo\": \"bar\"}")
assert.Equal(t, w.HeaderMap.Get("Content-Type"), "application/json; charset=utf-8")
}
// Tests that the response is serialized as JSON // Tests that the response is serialized as JSON
// we change the content-type before // we change the content-type before
func TestContextRenderAPIJSON(t *testing.T) { func TestContextRenderAPIJSON(t *testing.T) {

View File

@ -5,6 +5,7 @@
package render package render
import ( import (
"bytes"
"encoding/json" "encoding/json"
"net/http" "net/http"
) )
@ -17,6 +18,9 @@ type (
IndentedJSON struct { IndentedJSON struct {
Data interface{} Data interface{}
} }
RawJSON struct {
Data *bytes.Buffer
}
) )
var jsonContentType = []string{"application/json; charset=utf-8"} var jsonContentType = []string{"application/json; charset=utf-8"}
@ -39,3 +43,9 @@ func WriteJSON(w http.ResponseWriter, obj interface{}) error {
writeContentType(w, jsonContentType) writeContentType(w, jsonContentType)
return json.NewEncoder(w).Encode(obj) return json.NewEncoder(w).Encode(obj)
} }
func (r RawJSON) Render(w http.ResponseWriter) error {
writeContentType(w, jsonContentType)
w.Write(r.Data.Bytes())
return nil
}

View File

@ -13,6 +13,7 @@ type Render interface {
var ( var (
_ Render = JSON{} _ Render = JSON{}
_ Render = IndentedJSON{} _ Render = IndentedJSON{}
_ Render = RawJSON{}
_ Render = XML{} _ Render = XML{}
_ Render = String{} _ Render = String{}
_ Render = Redirect{} _ Render = Redirect{}