jsoniter_customize_test.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package jsoniter
  2. import (
  3. "reflect"
  4. "strconv"
  5. "testing"
  6. "time"
  7. "unsafe"
  8. "github.com/json-iterator/go/require"
  9. )
  10. func Test_customize_type_decoder(t *testing.T) {
  11. RegisterTypeDecoder("time.Time", func(ptr unsafe.Pointer, iter *Iterator) {
  12. t, err := time.ParseInLocation("2006-01-02 15:04:05", iter.ReadString(), time.UTC)
  13. if err != nil {
  14. iter.Error = err
  15. return
  16. }
  17. *((*time.Time)(ptr)) = t
  18. })
  19. defer CleanDecoders()
  20. val := time.Time{}
  21. err := Unmarshal([]byte(`"2016-12-05 08:43:28"`), &val)
  22. if err != nil {
  23. t.Fatal(err)
  24. }
  25. year, month, day := val.Date()
  26. if year != 2016 || month != 12 || day != 5 {
  27. t.Fatal(val)
  28. }
  29. }
  30. func Test_customize_type_encoder(t *testing.T) {
  31. should := require.New(t)
  32. RegisterTypeEncoder("time.Time", func(ptr unsafe.Pointer, stream *Stream) {
  33. t := *((*time.Time)(ptr))
  34. stream.WriteString(t.UTC().Format("2006-01-02 15:04:05"))
  35. })
  36. defer CleanEncoders()
  37. val := time.Unix(0, 0)
  38. str, err := MarshalToString(val)
  39. should.Nil(err)
  40. should.Equal(`"1970-01-01 00:00:00"`, str)
  41. }
  42. type Tom struct {
  43. field1 string
  44. }
  45. func Test_customize_field_decoder(t *testing.T) {
  46. RegisterFieldDecoder("jsoniter.Tom", "field1", func(ptr unsafe.Pointer, iter *Iterator) {
  47. *((*string)(ptr)) = strconv.Itoa(iter.ReadInt())
  48. })
  49. defer CleanDecoders()
  50. tom := Tom{}
  51. err := Unmarshal([]byte(`{"field1": 100}`), &tom)
  52. if err != nil {
  53. t.Fatal(err)
  54. }
  55. }
  56. type TestObject1 struct {
  57. field1 string
  58. }
  59. func Test_customize_field_by_extension(t *testing.T) {
  60. RegisterExtension(func(type_ reflect.Type, field *reflect.StructField) ([]string, DecoderFunc) {
  61. if type_.String() == "jsoniter.TestObject1" && field.Name == "field1" {
  62. return []string{"field-1"}, func(ptr unsafe.Pointer, iter *Iterator) {
  63. *((*string)(ptr)) = strconv.Itoa(iter.ReadInt())
  64. }
  65. }
  66. return nil, nil
  67. })
  68. obj := TestObject1{}
  69. err := Unmarshal([]byte(`{"field-1": 100}`), &obj)
  70. if err != nil {
  71. t.Fatal(err)
  72. }
  73. if obj.field1 != "100" {
  74. t.Fatal(obj.field1)
  75. }
  76. }