jsoniter_skip_test.go 3.0 KB

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