jsoniter_skip_test.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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. func Test_skip_empty(t *testing.T) {
  95. should := require.New(t)
  96. should.NotNil(Get([]byte("")).LastError())
  97. }
  98. type TestResp struct {
  99. Code uint64
  100. }
  101. func Benchmark_jsoniter_skip(b *testing.B) {
  102. input := []byte(`
  103. {
  104. "_shards":{
  105. "total" : 5,
  106. "successful" : 5,
  107. "failed" : 0
  108. },
  109. "hits":{
  110. "total" : 1,
  111. "hits" : [
  112. {
  113. "_index" : "twitter",
  114. "_type" : "tweet",
  115. "_id" : "1",
  116. "_source" : {
  117. "user" : "kimchy",
  118. "postDate" : "2009-11-15T14:12:12",
  119. "message" : "trying out Elasticsearch"
  120. }
  121. }
  122. ]
  123. },
  124. "code": 200
  125. }`)
  126. for n := 0; n < b.N; n++ {
  127. result := TestResp{}
  128. iter := ParseBytes(ConfigDefault, input)
  129. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  130. switch field {
  131. case "code":
  132. result.Code = iter.ReadUint64()
  133. default:
  134. iter.Skip()
  135. }
  136. }
  137. }
  138. }
  139. func Benchmark_json_skip(b *testing.B) {
  140. input := []byte(`
  141. {
  142. "_shards":{
  143. "total" : 5,
  144. "successful" : 5,
  145. "failed" : 0
  146. },
  147. "hits":{
  148. "total" : 1,
  149. "hits" : [
  150. {
  151. "_index" : "twitter",
  152. "_type" : "tweet",
  153. "_id" : "1",
  154. "_source" : {
  155. "user" : "kimchy",
  156. "postDate" : "2009-11-15T14:12:12",
  157. "message" : "trying out Elasticsearch"
  158. }
  159. }
  160. ]
  161. },
  162. "code": 200
  163. }`)
  164. for n := 0; n < b.N; n++ {
  165. result := TestResp{}
  166. json.Unmarshal(input, &result)
  167. }
  168. }