jsoniter_skip_test.go 3.5 KB

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