...
1 package issue_test
2
3 import (
4 `encoding/json`
5 `fmt`
6 `reflect`
7 `strconv`
8 `testing`
9 `time`
10
11 `github.com/bytedance/sonic`
12 `github.com/davecgh/go-spew/spew`
13 `github.com/stretchr/testify/require`
14 )
15
16 func TestPointerValueRecurseMarshal(t *testing.T) {
17 info := &TestStruct1{
18 StartTime: JSONTime(time.Now()),
19 }
20 infos := &[]*TestStruct1{info}
21
22 bytes, err1 := json.Marshal(infos)
23 fmt.Printf("%+v\n", string(bytes))
24 spew.Dump(bytes, err1)
25
26 jbytes, err2 := sonic.Marshal(infos)
27 fmt.Printf("%+v\n", string(jbytes))
28 spew.Dump(jbytes, err2)
29 require.Equal(t, bytes, jbytes)
30 }
31
32 func TestPointerValueRecursePretouch(t *testing.T) {
33 info := &TestStruct2{
34 StartTime: JSONTime(time.Now()),
35 }
36 infos := &[]*TestStruct2{info}
37
38 bytes, err1 := json.Marshal(infos)
39 fmt.Printf("%+v\n", string(bytes))
40 spew.Dump(bytes, err1)
41
42 sonic.Pretouch(reflect.TypeOf(infos))
43 jbytes, err2 := sonic.Marshal(infos)
44 fmt.Printf("%+v\n", string(jbytes))
45 spew.Dump(jbytes, err2)
46 require.Equal(t, bytes, jbytes)
47 }
48
49 type TestStruct1 struct {
50 StartTime JSONTime
51 }
52
53 type TestStruct2 struct {
54 StartTime JSONTime
55 }
56
57 type JSONTime time.Time
58
59 func (t *JSONTime) MarshalJSON() ([]byte, error) {
60 return []byte(strconv.FormatInt(time.Time(*t).Unix(), 10)), nil
61 }
View as plain text