You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package json
  5. import (
  6. "bytes"
  7. "encoding/json"
  8. "io"
  9. jsoniter "github.com/json-iterator/go"
  10. )
  11. // Encoder represents an encoder for json
  12. type Encoder interface {
  13. Encode(v interface{}) error
  14. }
  15. // Decoder represents a decoder for json
  16. type Decoder interface {
  17. Decode(v interface{}) error
  18. }
  19. // Interface represents an interface to handle json data
  20. type Interface interface {
  21. Marshal(v interface{}) ([]byte, error)
  22. Unmarshal(data []byte, v interface{}) error
  23. NewEncoder(writer io.Writer) Encoder
  24. NewDecoder(reader io.Reader) Decoder
  25. Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error
  26. }
  27. var (
  28. // DefaultJSONHandler default json handler
  29. DefaultJSONHandler Interface = JSONiter{jsoniter.ConfigCompatibleWithStandardLibrary}
  30. _ Interface = StdJSON{}
  31. _ Interface = JSONiter{}
  32. )
  33. // StdJSON implements Interface via encoding/json
  34. type StdJSON struct{}
  35. // Marshal implements Interface
  36. func (StdJSON) Marshal(v interface{}) ([]byte, error) {
  37. return json.Marshal(v)
  38. }
  39. // Unmarshal implements Interface
  40. func (StdJSON) Unmarshal(data []byte, v interface{}) error {
  41. return json.Unmarshal(data, v)
  42. }
  43. // NewEncoder implements Interface
  44. func (StdJSON) NewEncoder(writer io.Writer) Encoder {
  45. return json.NewEncoder(writer)
  46. }
  47. // NewDecoder implements Interface
  48. func (StdJSON) NewDecoder(reader io.Reader) Decoder {
  49. return json.NewDecoder(reader)
  50. }
  51. // Indent implements Interface
  52. func (StdJSON) Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error {
  53. return json.Indent(dst, src, prefix, indent)
  54. }
  55. // JSONiter implements Interface via jsoniter
  56. type JSONiter struct {
  57. jsoniter.API
  58. }
  59. // Marshal implements Interface
  60. func (j JSONiter) Marshal(v interface{}) ([]byte, error) {
  61. return j.API.Marshal(v)
  62. }
  63. // Unmarshal implements Interface
  64. func (j JSONiter) Unmarshal(data []byte, v interface{}) error {
  65. return j.API.Unmarshal(data, v)
  66. }
  67. // NewEncoder implements Interface
  68. func (j JSONiter) NewEncoder(writer io.Writer) Encoder {
  69. return j.API.NewEncoder(writer)
  70. }
  71. // NewDecoder implements Interface
  72. func (j JSONiter) NewDecoder(reader io.Reader) Decoder {
  73. return j.API.NewDecoder(reader)
  74. }
  75. // Indent implements Interface, since jsoniter don't support Indent, just use encoding/json's
  76. func (j JSONiter) Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error {
  77. return json.Indent(dst, src, prefix, indent)
  78. }
  79. // Marshal converts object as bytes
  80. func Marshal(v interface{}) ([]byte, error) {
  81. return DefaultJSONHandler.Marshal(v)
  82. }
  83. // Unmarshal decodes object from bytes
  84. func Unmarshal(data []byte, v interface{}) error {
  85. return DefaultJSONHandler.Unmarshal(data, v)
  86. }
  87. // NewEncoder creates an encoder to write objects to writer
  88. func NewEncoder(writer io.Writer) Encoder {
  89. return DefaultJSONHandler.NewEncoder(writer)
  90. }
  91. // NewDecoder creates a decoder to read objects from reader
  92. func NewDecoder(reader io.Reader) Decoder {
  93. return DefaultJSONHandler.NewDecoder(reader)
  94. }
  95. // Indent appends to dst an indented form of the JSON-encoded src.
  96. func Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error {
  97. return DefaultJSONHandler.Indent(dst, src, prefix, indent)
  98. }
  99. // MarshalIndent copied from encoding/json
  100. func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) {
  101. b, err := Marshal(v)
  102. if err != nil {
  103. return nil, err
  104. }
  105. var buf bytes.Buffer
  106. err = Indent(&buf, b, prefix, indent)
  107. if err != nil {
  108. return nil, err
  109. }
  110. return buf.Bytes(), nil
  111. }
  112. // Valid proxy to json.Valid
  113. func Valid(data []byte) bool {
  114. return json.Valid(data)
  115. }