json.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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.
  4. package render
  5. import (
  6. "bytes"
  7. "html/template"
  8. "net/http"
  9. "github.com/gin-gonic/gin/json"
  10. )
  11. type JSON struct {
  12. Data interface{}
  13. }
  14. type IndentedJSON struct {
  15. Data interface{}
  16. }
  17. type SecureJSON struct {
  18. Prefix string
  19. Data interface{}
  20. }
  21. type JsonpJSON struct {
  22. Callback string
  23. Data interface{}
  24. }
  25. type SecureJSONPrefix string
  26. var jsonContentType = []string{"application/json; charset=utf-8"}
  27. var jsonpContentType = []string{"application/javascript; charset=utf-8"}
  28. func (r JSON) Render(w http.ResponseWriter) (err error) {
  29. if err = WriteJSON(w, r.Data); err != nil {
  30. panic(err)
  31. }
  32. return
  33. }
  34. func (r JSON) WriteContentType(w http.ResponseWriter) {
  35. writeContentType(w, jsonContentType)
  36. }
  37. func WriteJSON(w http.ResponseWriter, obj interface{}) error {
  38. writeContentType(w, jsonContentType)
  39. jsonBytes, err := json.Marshal(obj)
  40. if err != nil {
  41. return err
  42. }
  43. w.Write(jsonBytes)
  44. return nil
  45. }
  46. func (r IndentedJSON) Render(w http.ResponseWriter) error {
  47. r.WriteContentType(w)
  48. jsonBytes, err := json.MarshalIndent(r.Data, "", " ")
  49. if err != nil {
  50. return err
  51. }
  52. w.Write(jsonBytes)
  53. return nil
  54. }
  55. func (r IndentedJSON) WriteContentType(w http.ResponseWriter) {
  56. writeContentType(w, jsonContentType)
  57. }
  58. func (r SecureJSON) Render(w http.ResponseWriter) error {
  59. r.WriteContentType(w)
  60. jsonBytes, err := json.Marshal(r.Data)
  61. if err != nil {
  62. return err
  63. }
  64. // if the jsonBytes is array values
  65. if bytes.HasPrefix(jsonBytes, []byte("[")) && bytes.HasSuffix(jsonBytes, []byte("]")) {
  66. w.Write([]byte(r.Prefix))
  67. }
  68. w.Write(jsonBytes)
  69. return nil
  70. }
  71. func (r SecureJSON) WriteContentType(w http.ResponseWriter) {
  72. writeContentType(w, jsonContentType)
  73. }
  74. func (r JsonpJSON) Render(w http.ResponseWriter) (err error) {
  75. r.WriteContentType(w)
  76. ret, err := json.Marshal(r.Data)
  77. if err != nil {
  78. return err
  79. }
  80. if r.Callback == "" {
  81. w.Write(ret)
  82. return nil
  83. }
  84. callback := template.JSEscapeString(r.Callback)
  85. w.Write([]byte(callback))
  86. w.Write([]byte("("))
  87. w.Write(ret)
  88. w.Write([]byte(")"))
  89. return nil
  90. }
  91. func (r JsonpJSON) WriteContentType(w http.ResponseWriter) {
  92. writeContentType(w, jsonpContentType)
  93. }