json.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. "net/http"
  8. "github.com/json-iterator/go"
  9. )
  10. var json = jsoniter.ConfigCompatibleWithStandardLibrary
  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 SecureJSONPrefix string
  22. var jsonContentType = []string{"application/json; charset=utf-8"}
  23. func (r JSON) Render(w http.ResponseWriter) (err error) {
  24. if err = WriteJSON(w, r.Data); err != nil {
  25. panic(err)
  26. }
  27. return
  28. }
  29. func (r JSON) WriteContentType(w http.ResponseWriter) {
  30. writeContentType(w, jsonContentType)
  31. }
  32. func WriteJSON(w http.ResponseWriter, obj interface{}) error {
  33. writeContentType(w, jsonContentType)
  34. jsonBytes, err := json.Marshal(obj)
  35. if err != nil {
  36. return err
  37. }
  38. w.Write(jsonBytes)
  39. return nil
  40. }
  41. func (r IndentedJSON) Render(w http.ResponseWriter) error {
  42. r.WriteContentType(w)
  43. jsonBytes, err := json.MarshalIndent(r.Data, "", " ")
  44. if err != nil {
  45. return err
  46. }
  47. w.Write(jsonBytes)
  48. return nil
  49. }
  50. func (r IndentedJSON) WriteContentType(w http.ResponseWriter) {
  51. writeContentType(w, jsonContentType)
  52. }
  53. func (r SecureJSON) Render(w http.ResponseWriter) error {
  54. r.WriteContentType(w)
  55. jsonBytes, err := json.Marshal(r.Data)
  56. if err != nil {
  57. return err
  58. }
  59. // if the jsonBytes is array values
  60. if bytes.HasPrefix(jsonBytes, []byte("[")) && bytes.HasSuffix(jsonBytes, []byte("]")) {
  61. w.Write([]byte(r.Prefix))
  62. }
  63. w.Write(jsonBytes)
  64. return nil
  65. }
  66. func (r SecureJSON) WriteContentType(w http.ResponseWriter) {
  67. writeContentType(w, jsonContentType)
  68. }