1
// Copyright 2014 Manu Martinez-Almeida. All rights reserved.
2
// Use of this source code is governed by a MIT style
3
// license that can be found in the LICENSE file.
13
"github.com/gin-gonic/gin/internal/bytesconv"
14
"github.com/gin-gonic/gin/internal/json"
17
// JSON contains the given interface object.
22
// IndentedJSON contains the given interface object.
23
type IndentedJSON struct {
27
// SecureJSON contains the given interface object and its prefix.
28
type SecureJSON struct {
33
// JsonpJSON contains the given interface object its callback.
34
type JsonpJSON struct {
39
// AsciiJSON contains the given interface object.
40
type AsciiJSON struct {
44
// PureJSON contains the given interface object.
50
jsonContentType = []string{"application/json; charset=utf-8"}
51
jsonpContentType = []string{"application/javascript; charset=utf-8"}
52
jsonASCIIContentType = []string{"application/json"}
55
// Render (JSON) writes data with custom ContentType.
56
func (r JSON) Render(w http.ResponseWriter) error {
57
return WriteJSON(w, r.Data)
60
// WriteContentType (JSON) writes JSON ContentType.
61
func (r JSON) WriteContentType(w http.ResponseWriter) {
62
writeContentType(w, jsonContentType)
65
// WriteJSON marshals the given interface object and writes it with custom ContentType.
66
func WriteJSON(w http.ResponseWriter, obj any) error {
67
writeContentType(w, jsonContentType)
68
jsonBytes, err := json.Marshal(obj)
72
_, err = w.Write(jsonBytes)
76
// Render (IndentedJSON) marshals the given interface object and writes it with custom ContentType.
77
func (r IndentedJSON) Render(w http.ResponseWriter) error {
79
jsonBytes, err := json.MarshalIndent(r.Data, "", " ")
83
_, err = w.Write(jsonBytes)
87
// WriteContentType (IndentedJSON) writes JSON ContentType.
88
func (r IndentedJSON) WriteContentType(w http.ResponseWriter) {
89
writeContentType(w, jsonContentType)
92
// Render (SecureJSON) marshals the given interface object and writes it with custom ContentType.
93
func (r SecureJSON) Render(w http.ResponseWriter) error {
95
jsonBytes, err := json.Marshal(r.Data)
99
// if the jsonBytes is array values
100
if bytes.HasPrefix(jsonBytes, bytesconv.StringToBytes("[")) && bytes.HasSuffix(jsonBytes,
101
bytesconv.StringToBytes("]")) {
102
if _, err = w.Write(bytesconv.StringToBytes(r.Prefix)); err != nil {
106
_, err = w.Write(jsonBytes)
110
// WriteContentType (SecureJSON) writes JSON ContentType.
111
func (r SecureJSON) WriteContentType(w http.ResponseWriter) {
112
writeContentType(w, jsonContentType)
115
// Render (JsonpJSON) marshals the given interface object and writes it and its callback with custom ContentType.
116
func (r JsonpJSON) Render(w http.ResponseWriter) (err error) {
117
r.WriteContentType(w)
118
ret, err := json.Marshal(r.Data)
123
if r.Callback == "" {
124
_, err = w.Write(ret)
128
callback := template.JSEscapeString(r.Callback)
129
if _, err = w.Write(bytesconv.StringToBytes(callback)); err != nil {
133
if _, err = w.Write(bytesconv.StringToBytes("(")); err != nil {
137
if _, err = w.Write(ret); err != nil {
141
if _, err = w.Write(bytesconv.StringToBytes(");")); err != nil {
148
// WriteContentType (JsonpJSON) writes Javascript ContentType.
149
func (r JsonpJSON) WriteContentType(w http.ResponseWriter) {
150
writeContentType(w, jsonpContentType)
153
// Render (AsciiJSON) marshals the given interface object and writes it with custom ContentType.
154
func (r AsciiJSON) Render(w http.ResponseWriter) (err error) {
155
r.WriteContentType(w)
156
ret, err := json.Marshal(r.Data)
161
var buffer bytes.Buffer
162
for _, r := range bytesconv.BytesToString(ret) {
165
cvt = fmt.Sprintf("\\u%04x", int64(r))
167
buffer.WriteString(cvt)
170
_, err = w.Write(buffer.Bytes())
174
// WriteContentType (AsciiJSON) writes JSON ContentType.
175
func (r AsciiJSON) WriteContentType(w http.ResponseWriter) {
176
writeContentType(w, jsonASCIIContentType)
179
// Render (PureJSON) writes custom ContentType and encodes the given interface object.
180
func (r PureJSON) Render(w http.ResponseWriter) error {
181
r.WriteContentType(w)
182
encoder := json.NewEncoder(w)
183
encoder.SetEscapeHTML(false)
184
return encoder.Encode(r.Data)
187
// WriteContentType (PureJSON) writes custom ContentType.
188
func (r PureJSON) WriteContentType(w http.ResponseWriter) {
189
writeContentType(w, jsonContentType)