jsoniter_customize_test.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. package jsoniter
  2. import (
  3. "encoding/json"
  4. "github.com/json-iterator/go/require"
  5. "reflect"
  6. "strconv"
  7. "testing"
  8. "time"
  9. "unsafe"
  10. )
  11. func Test_customize_type_decoder(t *testing.T) {
  12. RegisterTypeDecoder("time.Time", func(ptr unsafe.Pointer, iter *Iterator) {
  13. t, err := time.ParseInLocation("2006-01-02 15:04:05", iter.ReadString(), time.UTC)
  14. if err != nil {
  15. iter.Error = err
  16. return
  17. }
  18. *((*time.Time)(ptr)) = t
  19. })
  20. defer ConfigDefault.CleanDecoders()
  21. val := time.Time{}
  22. err := Unmarshal([]byte(`"2016-12-05 08:43:28"`), &val)
  23. if err != nil {
  24. t.Fatal(err)
  25. }
  26. year, month, day := val.Date()
  27. if year != 2016 || month != 12 || day != 5 {
  28. t.Fatal(val)
  29. }
  30. }
  31. func Test_customize_type_encoder(t *testing.T) {
  32. should := require.New(t)
  33. RegisterTypeEncoder("time.Time", func(ptr unsafe.Pointer, stream *Stream) {
  34. t := *((*time.Time)(ptr))
  35. stream.WriteString(t.UTC().Format("2006-01-02 15:04:05"))
  36. })
  37. defer ConfigDefault.CleanEncoders()
  38. val := time.Unix(0, 0)
  39. str, err := MarshalToString(val)
  40. should.Nil(err)
  41. should.Equal(`"1970-01-01 00:00:00"`, str)
  42. }
  43. func Test_customize_byte_array_encoder(t *testing.T) {
  44. ConfigDefault.CleanEncoders()
  45. should := require.New(t)
  46. RegisterTypeEncoder("[]uint8", func(ptr unsafe.Pointer, stream *Stream) {
  47. t := *((*[]byte)(ptr))
  48. stream.WriteString(string(t))
  49. })
  50. defer ConfigDefault.CleanEncoders()
  51. val := []byte("abc")
  52. str, err := MarshalToString(val)
  53. should.Nil(err)
  54. should.Equal(`"abc"`, str)
  55. }
  56. func Test_customize_float_marshal(t *testing.T) {
  57. should := require.New(t)
  58. json := Config{MarshalFloatWith6Digits: true}.Froze()
  59. str, err := json.MarshalToString(float32(1.23456789))
  60. should.Nil(err)
  61. should.Equal("1.234568", str)
  62. }
  63. type Tom struct {
  64. field1 string
  65. }
  66. func Test_customize_field_decoder(t *testing.T) {
  67. RegisterFieldDecoder("jsoniter.Tom", "field1", func(ptr unsafe.Pointer, iter *Iterator) {
  68. *((*string)(ptr)) = strconv.Itoa(iter.ReadInt())
  69. })
  70. defer ConfigDefault.CleanDecoders()
  71. tom := Tom{}
  72. err := Unmarshal([]byte(`{"field1": 100}`), &tom)
  73. if err != nil {
  74. t.Fatal(err)
  75. }
  76. }
  77. type TestObject1 struct {
  78. field1 string
  79. }
  80. func Test_customize_field_by_extension(t *testing.T) {
  81. should := require.New(t)
  82. RegisterExtension(func(type_ reflect.Type, field *reflect.StructField) ([]string, EncoderFunc, DecoderFunc) {
  83. if type_.String() == "jsoniter.TestObject1" && field.Name == "field1" {
  84. encode := func(ptr unsafe.Pointer, stream *Stream) {
  85. str := *((*string)(ptr))
  86. val, _ := strconv.Atoi(str)
  87. stream.WriteInt(val)
  88. }
  89. decode := func(ptr unsafe.Pointer, iter *Iterator) {
  90. *((*string)(ptr)) = strconv.Itoa(iter.ReadInt())
  91. }
  92. return []string{"field-1"}, encode, decode
  93. }
  94. return nil, nil, nil
  95. })
  96. obj := TestObject1{}
  97. err := UnmarshalFromString(`{"field-1": 100}`, &obj)
  98. should.Nil(err)
  99. should.Equal("100", obj.field1)
  100. str, err := MarshalToString(obj)
  101. should.Nil(err)
  102. should.Equal(`{"field-1":100}`, str)
  103. }
  104. func Test_unexported_fields(t *testing.T) {
  105. jsoniter := Config{SupportUnexportedStructFields: true}.Froze()
  106. should := require.New(t)
  107. type TestObject struct {
  108. field1 string
  109. field2 string `json:"field-2"`
  110. }
  111. obj := TestObject{}
  112. obj.field1 = "hello"
  113. should.Nil(jsoniter.UnmarshalFromString(`{}`, &obj))
  114. should.Equal("hello", obj.field1)
  115. should.Nil(jsoniter.UnmarshalFromString(`{"field1": "world", "field-2": "abc"}`, &obj))
  116. should.Equal("world", obj.field1)
  117. should.Equal("abc", obj.field2)
  118. str, err := jsoniter.MarshalToString(obj)
  119. should.Nil(err)
  120. should.Contains(str, `"field-2":"abc"`)
  121. }
  122. type ObjectImplementedMarshaler int
  123. func (obj *ObjectImplementedMarshaler) MarshalJSON() ([]byte, error) {
  124. return []byte(`"hello"`), nil
  125. }
  126. func Test_marshaler(t *testing.T) {
  127. type TestObject struct {
  128. Field *ObjectImplementedMarshaler
  129. }
  130. should := require.New(t)
  131. val := ObjectImplementedMarshaler(100)
  132. obj := TestObject{&val}
  133. bytes, err := json.Marshal(obj)
  134. should.Nil(err)
  135. should.Equal(`{"Field":"hello"}`, string(bytes))
  136. str, err := MarshalToString(obj)
  137. should.Nil(err)
  138. should.Equal(`{"Field":"hello"}`, str)
  139. }
  140. func Test_marshaler_and_encoder(t *testing.T) {
  141. type TestObject struct {
  142. Field *ObjectImplementedMarshaler
  143. }
  144. should := require.New(t)
  145. RegisterTypeEncoder("jsoniter.ObjectImplementedMarshaler", func(ptr unsafe.Pointer, stream *Stream) {
  146. stream.WriteString("hello from encoder")
  147. })
  148. val := ObjectImplementedMarshaler(100)
  149. obj := TestObject{&val}
  150. bytes, err := json.Marshal(obj)
  151. should.Nil(err)
  152. should.Equal(`{"Field":"hello"}`, string(bytes))
  153. str, err := MarshalToString(obj)
  154. should.Nil(err)
  155. should.Equal(`{"Field":"hello from encoder"}`, str)
  156. }
  157. type ObjectImplementedUnmarshaler int
  158. func (obj *ObjectImplementedUnmarshaler) UnmarshalJSON([]byte) error {
  159. *obj = 100
  160. return nil
  161. }
  162. func Test_unmarshaler(t *testing.T) {
  163. type TestObject struct {
  164. Field *ObjectImplementedUnmarshaler
  165. Field2 string
  166. }
  167. should := require.New(t)
  168. obj := TestObject{}
  169. val := ObjectImplementedUnmarshaler(0)
  170. obj.Field = &val
  171. err := json.Unmarshal([]byte(`{"Field":"hello"}`), &obj)
  172. should.Nil(err)
  173. should.Equal(100, int(*obj.Field))
  174. err = Unmarshal([]byte(`{"Field":"hello"}`), &obj)
  175. should.Nil(err)
  176. should.Equal(100, int(*obj.Field))
  177. }
  178. func Test_unmarshaler_and_decoder(t *testing.T) {
  179. type TestObject struct {
  180. Field *ObjectImplementedUnmarshaler
  181. Field2 string
  182. }
  183. should := require.New(t)
  184. RegisterTypeDecoder("jsoniter.ObjectImplementedUnmarshaler", func(ptr unsafe.Pointer, iter *Iterator) {
  185. *(*ObjectImplementedUnmarshaler)(ptr) = 10
  186. iter.Skip()
  187. })
  188. obj := TestObject{}
  189. val := ObjectImplementedUnmarshaler(0)
  190. obj.Field = &val
  191. err := json.Unmarshal([]byte(`{"Field":"hello"}`), &obj)
  192. should.Nil(err)
  193. should.Equal(100, int(*obj.Field))
  194. err = Unmarshal([]byte(`{"Field":"hello"}`), &obj)
  195. should.Nil(err)
  196. should.Equal(10, int(*obj.Field))
  197. }