| package test |
| |
| import ( |
| "bytes" |
| "fmt" |
| "github.com/json-iterator/go" |
| "github.com/stretchr/testify/require" |
| "strconv" |
| "testing" |
| "time" |
| "unsafe" |
| ) |
| |
| func Test_customize_type_decoder(t *testing.T) { |
| t.Skip() |
| jsoniter.RegisterTypeDecoderFunc("time.Time", func(ptr unsafe.Pointer, iter *jsoniter.Iterator) { |
| t, err := time.ParseInLocation("2006-01-02 15:04:05", iter.ReadString(), time.UTC) |
| if err != nil { |
| iter.Error = err |
| return |
| } |
| *((*time.Time)(ptr)) = t |
| }) |
| //defer jsoniter.ConfigDefault.(*frozenConfig).cleanDecoders() |
| val := time.Time{} |
| err := jsoniter.Unmarshal([]byte(`"2016-12-05 08:43:28"`), &val) |
| if err != nil { |
| t.Fatal(err) |
| } |
| year, month, day := val.Date() |
| if year != 2016 || month != 12 || day != 5 { |
| t.Fatal(val) |
| } |
| } |
| |
| func Test_customize_byte_array_encoder(t *testing.T) { |
| t.Skip() |
| //jsoniter.ConfigDefault.(*frozenConfig).cleanEncoders() |
| should := require.New(t) |
| jsoniter.RegisterTypeEncoderFunc("[]uint8", func(ptr unsafe.Pointer, stream *jsoniter.Stream) { |
| t := *((*[]byte)(ptr)) |
| stream.WriteString(string(t)) |
| }, nil) |
| //defer jsoniter.ConfigDefault.(*frozenConfig).cleanEncoders() |
| val := []byte("abc") |
| str, err := jsoniter.MarshalToString(val) |
| should.Nil(err) |
| should.Equal(`"abc"`, str) |
| } |
| |
| type CustomEncoderAttachmentTestStruct struct { |
| Value int32 `json:"value"` |
| } |
| |
| type CustomEncoderAttachmentTestStructEncoder struct {} |
| |
| func (c *CustomEncoderAttachmentTestStructEncoder) Encode(ptr unsafe.Pointer, stream *jsoniter.Stream) { |
| attachVal, ok := stream.Attachment.(int) |
| stream.WriteRaw(`"`) |
| stream.WriteRaw(fmt.Sprintf("%t %d", ok, attachVal)) |
| stream.WriteRaw(`"`) |
| } |
| |
| func (c *CustomEncoderAttachmentTestStructEncoder) IsEmpty(ptr unsafe.Pointer) bool { |
| return false |
| } |
| |
| func Test_custom_encoder_attachment(t *testing.T) { |
| |
| jsoniter.RegisterTypeEncoder("test.CustomEncoderAttachmentTestStruct", &CustomEncoderAttachmentTestStructEncoder{}) |
| expectedValue := 17 |
| should := require.New(t) |
| buf := &bytes.Buffer{} |
| stream := jsoniter.NewStream(jsoniter.Config{SortMapKeys: true}.Froze(), buf, 4096) |
| stream.Attachment = expectedValue |
| val := map[string]CustomEncoderAttachmentTestStruct{"a": {}} |
| stream.WriteVal(val) |
| stream.Flush() |
| should.Nil(stream.Error) |
| should.Equal("{\"a\":\"true 17\"}", buf.String()) |
| } |
| |
| func Test_customize_field_decoder(t *testing.T) { |
| type Tom struct { |
| field1 string |
| } |
| jsoniter.RegisterFieldDecoderFunc("jsoniter.Tom", "field1", func(ptr unsafe.Pointer, iter *jsoniter.Iterator) { |
| *((*string)(ptr)) = strconv.Itoa(iter.ReadInt()) |
| }) |
| //defer jsoniter.ConfigDefault.(*frozenConfig).cleanDecoders() |
| tom := Tom{} |
| err := jsoniter.Unmarshal([]byte(`{"field1": 100}`), &tom) |
| if err != nil { |
| t.Fatal(err) |
| } |
| } |
| |
| func Test_recursive_empty_interface_customization(t *testing.T) { |
| t.Skip() |
| var obj interface{} |
| jsoniter.RegisterTypeDecoderFunc("interface {}", func(ptr unsafe.Pointer, iter *jsoniter.Iterator) { |
| switch iter.WhatIsNext() { |
| case jsoniter.NumberValue: |
| *(*interface{})(ptr) = iter.ReadInt64() |
| default: |
| *(*interface{})(ptr) = iter.Read() |
| } |
| }) |
| should := require.New(t) |
| jsoniter.Unmarshal([]byte("[100]"), &obj) |
| should.Equal([]interface{}{int64(100)}, obj) |
| } |
| |
| type MyInterface interface { |
| Hello() string |
| } |
| |
| type MyString string |
| |
| func (ms MyString) Hello() string { |
| return string(ms) |
| } |
| |
| func Test_read_custom_interface(t *testing.T) { |
| t.Skip() |
| should := require.New(t) |
| var val MyInterface |
| jsoniter.RegisterTypeDecoderFunc("jsoniter.MyInterface", func(ptr unsafe.Pointer, iter *jsoniter.Iterator) { |
| *((*MyInterface)(ptr)) = MyString(iter.ReadString()) |
| }) |
| err := jsoniter.UnmarshalFromString(`"hello"`, &val) |
| should.Nil(err) |
| should.Equal("hello", val.Hello()) |
| } |
| |
| const flow1 = ` |
| {"A":"hello"} |
| {"A":"hello"} |
| {"A":"hello"} |
| {"A":"hello"} |
| {"A":"hello"}` |
| |
| const flow2 = ` |
| {"A":"hello"} |
| {"A":"hello"} |
| {"A":"hello"} |
| {"A":"hello"} |
| {"A":"hello"} |
| ` |
| |
| type ( |
| Type1 struct { |
| A string |
| } |
| |
| Type2 struct { |
| A string |
| } |
| ) |
| |
| func (t *Type2) UnmarshalJSON(data []byte) error { |
| return nil |
| } |
| |
| func (t *Type2) MarshalJSON() ([]byte, error) { |
| return nil, nil |
| } |
| |
| func TestType1NoFinalLF(t *testing.T) { |
| reader := bytes.NewReader([]byte(flow1)) |
| dec := jsoniter.NewDecoder(reader) |
| |
| i := 0 |
| for dec.More() { |
| data := &Type1{} |
| if err := dec.Decode(data); err != nil { |
| t.Errorf("at %v got %v", i, err) |
| } |
| i++ |
| } |
| } |
| |
| func TestType1FinalLF(t *testing.T) { |
| reader := bytes.NewReader([]byte(flow2)) |
| dec := jsoniter.NewDecoder(reader) |
| |
| i := 0 |
| for dec.More() { |
| data := &Type1{} |
| if err := dec.Decode(data); err != nil { |
| t.Errorf("at %v got %v", i, err) |
| } |
| i++ |
| } |
| } |
| |
| func TestType2NoFinalLF(t *testing.T) { |
| reader := bytes.NewReader([]byte(flow1)) |
| dec := jsoniter.NewDecoder(reader) |
| |
| i := 0 |
| for dec.More() { |
| data := &Type2{} |
| if err := dec.Decode(data); err != nil { |
| t.Errorf("at %v got %v", i, err) |
| } |
| i++ |
| } |
| } |
| |
| func TestType2FinalLF(t *testing.T) { |
| reader := bytes.NewReader([]byte(flow2)) |
| dec := jsoniter.NewDecoder(reader) |
| |
| i := 0 |
| for dec.More() { |
| data := &Type2{} |
| if err := dec.Decode(data); err != nil { |
| t.Errorf("at %v got %v", i, err) |
| } |
| i++ |
| } |
| } |