jsoniter_skip_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. package jsoniter
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "testing"
  6. "github.com/stretchr/testify/require"
  7. )
  8. func Test_skip_number_in_array(t *testing.T) {
  9. should := require.New(t)
  10. iter := ParseString(ConfigDefault, `[-0.12, "stream"]`)
  11. iter.ReadArray()
  12. iter.Skip()
  13. iter.ReadArray()
  14. should.Nil(iter.Error)
  15. should.Equal("stream", iter.ReadString())
  16. }
  17. func Test_skip_string_in_array(t *testing.T) {
  18. should := require.New(t)
  19. iter := ParseString(ConfigDefault, `["hello", "stream"]`)
  20. iter.ReadArray()
  21. iter.Skip()
  22. iter.ReadArray()
  23. should.Nil(iter.Error)
  24. should.Equal("stream", iter.ReadString())
  25. }
  26. func Test_skip_null(t *testing.T) {
  27. iter := ParseString(ConfigDefault, `[null , "stream"]`)
  28. iter.ReadArray()
  29. iter.Skip()
  30. iter.ReadArray()
  31. if iter.ReadString() != "stream" {
  32. t.FailNow()
  33. }
  34. }
  35. func Test_skip_true(t *testing.T) {
  36. iter := ParseString(ConfigDefault, `[true , "stream"]`)
  37. iter.ReadArray()
  38. iter.Skip()
  39. iter.ReadArray()
  40. if iter.ReadString() != "stream" {
  41. t.FailNow()
  42. }
  43. }
  44. func Test_skip_false(t *testing.T) {
  45. iter := ParseString(ConfigDefault, `[false , "stream"]`)
  46. iter.ReadArray()
  47. iter.Skip()
  48. iter.ReadArray()
  49. if iter.ReadString() != "stream" {
  50. t.FailNow()
  51. }
  52. }
  53. func Test_skip_array(t *testing.T) {
  54. iter := ParseString(ConfigDefault, `[[1, [2, [3], 4]], "stream"]`)
  55. iter.ReadArray()
  56. iter.Skip()
  57. iter.ReadArray()
  58. if iter.ReadString() != "stream" {
  59. t.FailNow()
  60. }
  61. }
  62. func Test_skip_empty_array(t *testing.T) {
  63. iter := ParseString(ConfigDefault, `[ [ ], "stream"]`)
  64. iter.ReadArray()
  65. iter.Skip()
  66. iter.ReadArray()
  67. if iter.ReadString() != "stream" {
  68. t.FailNow()
  69. }
  70. }
  71. func Test_skip_nested(t *testing.T) {
  72. iter := ParseString(ConfigDefault, `[ {"a" : [{"stream": "c"}], "d": 102 }, "stream"]`)
  73. iter.ReadArray()
  74. iter.Skip()
  75. iter.ReadArray()
  76. if iter.ReadString() != "stream" {
  77. t.FailNow()
  78. }
  79. }
  80. func Test_skip_and_return_bytes(t *testing.T) {
  81. should := require.New(t)
  82. iter := ParseString(ConfigDefault, `[ {"a" : [{"stream": "c"}], "d": 102 }, "stream"]`)
  83. iter.ReadArray()
  84. skipped := iter.SkipAndReturnBytes()
  85. should.Equal(`{"a" : [{"stream": "c"}], "d": 102 }`, string(skipped))
  86. }
  87. func Test_skip_and_return_bytes_with_reader(t *testing.T) {
  88. should := require.New(t)
  89. iter := Parse(ConfigDefault, bytes.NewBufferString(`[ {"a" : [{"stream": "c"}], "d": 102 }, "stream"]`), 4)
  90. iter.ReadArray()
  91. skipped := iter.SkipAndReturnBytes()
  92. should.Equal(`{"a" : [{"stream": "c"}], "d": 102 }`, string(skipped))
  93. }
  94. type TestResp struct {
  95. Code uint64
  96. }
  97. func Benchmark_jsoniter_skip(b *testing.B) {
  98. input := []byte(`
  99. {
  100. "_shards":{
  101. "total" : 5,
  102. "successful" : 5,
  103. "failed" : 0
  104. },
  105. "hits":{
  106. "total" : 1,
  107. "hits" : [
  108. {
  109. "_index" : "twitter",
  110. "_type" : "tweet",
  111. "_id" : "1",
  112. "_source" : {
  113. "user" : "kimchy",
  114. "postDate" : "2009-11-15T14:12:12",
  115. "message" : "trying out Elasticsearch"
  116. }
  117. }
  118. ]
  119. },
  120. "code": 200
  121. }`)
  122. for n := 0; n < b.N; n++ {
  123. result := TestResp{}
  124. iter := ParseBytes(ConfigDefault, input)
  125. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  126. switch field {
  127. case "code":
  128. result.Code = iter.ReadUint64()
  129. default:
  130. iter.Skip()
  131. }
  132. }
  133. }
  134. }
  135. func Benchmark_json_skip(b *testing.B) {
  136. input := []byte(`
  137. {
  138. "_shards":{
  139. "total" : 5,
  140. "successful" : 5,
  141. "failed" : 0
  142. },
  143. "hits":{
  144. "total" : 1,
  145. "hits" : [
  146. {
  147. "_index" : "twitter",
  148. "_type" : "tweet",
  149. "_id" : "1",
  150. "_source" : {
  151. "user" : "kimchy",
  152. "postDate" : "2009-11-15T14:12:12",
  153. "message" : "trying out Elasticsearch"
  154. }
  155. }
  156. ]
  157. },
  158. "code": 200
  159. }`)
  160. for n := 0; n < b.N; n++ {
  161. result := TestResp{}
  162. json.Unmarshal(input, &result)
  163. }
  164. }