jsoniter_skip_test.go 3.2 KB

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