jsoniter_reflect_test.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. package jsoniter
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "testing"
  6. "unsafe"
  7. "github.com/json-iterator/go/require"
  8. )
  9. func Test_reflect_one_field_struct(t *testing.T) {
  10. should := require.New(t)
  11. type TestObject struct {
  12. field1 string
  13. }
  14. obj := TestObject{}
  15. should.Nil(UnmarshalString(`{}`, &obj))
  16. should.Equal("", obj.field1)
  17. should.Nil(UnmarshalString(`{"field1": "hello"}`, &obj))
  18. should.Equal("hello", obj.field1)
  19. }
  20. func Test_reflect_two_fields_struct(t *testing.T) {
  21. should := require.New(t)
  22. type TestObject struct {
  23. field1 string
  24. field2 string
  25. }
  26. obj := TestObject{}
  27. should.Nil(UnmarshalString(`{}`, &obj))
  28. should.Equal("", obj.field1)
  29. should.Nil(UnmarshalString(`{"field1": "a", "field2": "b"}`, &obj))
  30. should.Equal("a", obj.field1)
  31. should.Equal("b", obj.field2)
  32. }
  33. func Test_reflect_three_fields_struct(t *testing.T) {
  34. should := require.New(t)
  35. type TestObject struct {
  36. field1 string
  37. field2 string
  38. field3 string
  39. }
  40. obj := TestObject{}
  41. should.Nil(UnmarshalString(`{}`, &obj))
  42. should.Equal("", obj.field1)
  43. should.Nil(UnmarshalString(`{"field1": "a", "field2": "b", "field3": "c"}`, &obj))
  44. should.Equal("a", obj.field1)
  45. should.Equal("b", obj.field2)
  46. should.Equal("c", obj.field3)
  47. }
  48. func Test_reflect_four_fields_struct(t *testing.T) {
  49. should := require.New(t)
  50. type TestObject struct {
  51. field1 string
  52. field2 string
  53. field3 string
  54. field4 string
  55. }
  56. obj := TestObject{}
  57. should.Nil(UnmarshalString(`{}`, &obj))
  58. should.Equal("", obj.field1)
  59. should.Nil(UnmarshalString(`{"field1": "a", "field2": "b", "field3": "c", "field4": "d"}`, &obj))
  60. should.Equal("a", obj.field1)
  61. should.Equal("b", obj.field2)
  62. should.Equal("c", obj.field3)
  63. should.Equal("d", obj.field4)
  64. }
  65. func Test_reflect_struct_string(t *testing.T) {
  66. type StructOfString struct {
  67. field1 string
  68. field2 string
  69. }
  70. iter := ParseString(`{"field1": "hello", "field2": "world"}`)
  71. Struct := StructOfString{}
  72. iter.Read(&Struct)
  73. if Struct.field1 != "hello" {
  74. fmt.Println(iter.Error)
  75. t.Fatal(Struct.field1)
  76. }
  77. if Struct.field2 != "world" {
  78. fmt.Println(iter.Error)
  79. t.Fatal(Struct.field2)
  80. }
  81. }
  82. type StructOfStringPtr struct {
  83. field1 *string
  84. field2 *string
  85. }
  86. func Test_reflect_struct_string_ptr(t *testing.T) {
  87. iter := ParseString(`{"field1": null, "field2": "world"}`)
  88. Struct := StructOfStringPtr{}
  89. iter.Read(&Struct)
  90. if Struct.field1 != nil {
  91. fmt.Println(iter.Error)
  92. t.Fatal(Struct.field1)
  93. }
  94. if *Struct.field2 != "world" {
  95. fmt.Println(iter.Error)
  96. t.Fatal(Struct.field2)
  97. }
  98. }
  99. type StructOfTag struct {
  100. Field1 string `json:"field-1"`
  101. Field2 string `json:"-"`
  102. Field3 int `json:",string"`
  103. }
  104. func Test_reflect_struct_tag_field(t *testing.T) {
  105. iter := ParseString(`{"field-1": "hello", "field2": "", "Field3": "100"}`)
  106. Struct := StructOfTag{Field2: "world"}
  107. iter.Read(&Struct)
  108. if Struct.Field1 != "hello" {
  109. fmt.Println(iter.Error)
  110. t.Fatal(Struct.Field1)
  111. }
  112. if Struct.Field2 != "world" {
  113. fmt.Println(iter.Error)
  114. t.Fatal(Struct.Field2)
  115. }
  116. if Struct.Field3 != 100 {
  117. fmt.Println(iter.Error)
  118. t.Fatal(Struct.Field3)
  119. }
  120. }
  121. func Test_reflect_slice(t *testing.T) {
  122. iter := ParseString(`["hello", "world"]`)
  123. slice := make([]string, 0, 5)
  124. iter.Read(&slice)
  125. if len(slice) != 2 {
  126. fmt.Println(iter.Error)
  127. t.Fatal(len(slice))
  128. }
  129. if slice[0] != "hello" {
  130. fmt.Println(iter.Error)
  131. t.Fatal(slice[0])
  132. }
  133. if slice[1] != "world" {
  134. fmt.Println(iter.Error)
  135. t.Fatal(slice[1])
  136. }
  137. }
  138. func Test_reflect_large_slice(t *testing.T) {
  139. iter := ParseString(`[1,2,3,4,5,6,7,8,9]`)
  140. slice := make([]int, 0, 1)
  141. iter.Read(&slice)
  142. if len(slice) != 9 {
  143. fmt.Println(iter.Error)
  144. t.Fatal(len(slice))
  145. }
  146. if slice[0] != 1 {
  147. fmt.Println(iter.Error)
  148. t.Fatal(slice[0])
  149. }
  150. if slice[8] != 9 {
  151. fmt.Println(iter.Error)
  152. t.Fatal(slice[8])
  153. }
  154. }
  155. func Test_reflect_nested(t *testing.T) {
  156. type StructOfString struct {
  157. field1 string
  158. field2 string
  159. }
  160. iter := ParseString(`[{"field1": "hello"}, null, {"field2": "world"}]`)
  161. slice := []*StructOfString{}
  162. iter.Read(&slice)
  163. if len(slice) != 3 {
  164. fmt.Println(iter.Error)
  165. t.Fatal(len(slice))
  166. }
  167. if slice[0].field1 != "hello" {
  168. fmt.Println(iter.Error)
  169. t.Fatal(slice[0])
  170. }
  171. if slice[1] != nil {
  172. fmt.Println(iter.Error)
  173. t.Fatal(slice[1])
  174. }
  175. if slice[2].field2 != "world" {
  176. fmt.Println(iter.Error)
  177. t.Fatal(slice[2])
  178. }
  179. }
  180. func Test_reflect_base64(t *testing.T) {
  181. iter := ParseString(`"YWJj"`)
  182. val := []byte{}
  183. RegisterTypeDecoder("[]uint8", func(ptr unsafe.Pointer, iter *Iterator) {
  184. *((*[]byte)(ptr)) = iter.ReadBase64()
  185. })
  186. defer CleanDecoders()
  187. iter.Read(&val)
  188. if "abc" != string(val) {
  189. t.Fatal(string(val))
  190. }
  191. }
  192. type StructOfTagOne struct {
  193. Field1 string `json:"field1"`
  194. Field2 string `json:"field2"`
  195. Field3 int `json:"field3,string"`
  196. Field4 int `json:"field4,string"`
  197. }
  198. func Benchmark_jsoniter_reflect(b *testing.B) {
  199. b.ReportAllocs()
  200. iter := Create()
  201. Struct := &StructOfTagOne{}
  202. //var Struct *StructOfTagOne
  203. input := []byte(`{"field3": "100", "field4": "100"}`)
  204. //input := []byte(`null`)
  205. for n := 0; n < b.N; n++ {
  206. iter.ResetBytes(input)
  207. iter.Read(&Struct)
  208. }
  209. }
  210. func Benchmark_jsoniter_direct(b *testing.B) {
  211. b.ReportAllocs()
  212. for n := 0; n < b.N; n++ {
  213. //iter := ParseString(`{"field1": "hello", "field2": "world"}`)
  214. //struct_ := StructOfString{}
  215. //for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  216. // switch field {
  217. // case "field1":
  218. // struct_.Field1 = iter.ReadString()
  219. // case "field2":
  220. // struct_.Field2 = iter.ReadString()
  221. // default:
  222. // iter.Skip()
  223. // }
  224. //}
  225. iter := ParseString(`["hello", "world"]`)
  226. array := make([]string, 0, 2)
  227. for iter.ReadArray() {
  228. array = append(array, iter.ReadString())
  229. }
  230. }
  231. }
  232. func Benchmark_json_reflect(b *testing.B) {
  233. b.ReportAllocs()
  234. for n := 0; n < b.N; n++ {
  235. Struct := StructOfTagOne{}
  236. json.Unmarshal([]byte(`{"field3": "100"}`), &Struct)
  237. //array := make([]string, 0, 2)
  238. //json.Unmarshal([]byte(`["hello", "world"]`), &array)
  239. }
  240. }