jsoniter_skip_test.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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_object(t *testing.T) {
  43. iter := ParseString(`[ {"a" : {"b": "c"}, "d": 102 }, "b"]`)
  44. iter.ReadArray()
  45. iter.Skip()
  46. iter.ReadArray()
  47. if iter.ReadString() != "b" {
  48. t.FailNow()
  49. }
  50. }
  51. func Test_skip_nested(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. type TestResp struct {
  61. Code uint64
  62. }
  63. func Benchmark_jsoniter_skip(b *testing.B) {
  64. for n := 0; n < b.N; n++ {
  65. result := TestResp{}
  66. iter := ParseString(`
  67. {
  68. "_shards":{
  69. "total" : 5,
  70. "successful" : 5,
  71. "failed" : 0
  72. },
  73. "code": 200,
  74. "hits":{
  75. "total" : 1,
  76. "hits" : [
  77. {
  78. "_index" : "twitter",
  79. "_type" : "tweet",
  80. "_id" : "1",
  81. "_source" : {
  82. "user" : "kimchy",
  83. "postDate" : "2009-11-15T14:12:12",
  84. "message" : "trying out Elasticsearch"
  85. }
  86. }
  87. ]
  88. }
  89. }`)
  90. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  91. switch field {
  92. case "code":
  93. result.Code = iter.ReadUint64()
  94. default:
  95. iter.Skip()
  96. }
  97. }
  98. }
  99. }
  100. func Benchmark_json_skip(b *testing.B) {
  101. for n := 0; n < b.N; n++ {
  102. result := TestResp{}
  103. json.Unmarshal([]byte(`
  104. {
  105. "_shards":{
  106. "total" : 5,
  107. "successful" : 5,
  108. "failed" : 0
  109. },
  110. "code": 200,
  111. "hits":{
  112. "total" : 1,
  113. "hits" : [
  114. {
  115. "_index" : "twitter",
  116. "_type" : "tweet",
  117. "_id" : "1",
  118. "_source" : {
  119. "user" : "kimchy",
  120. "postDate" : "2009-11-15T14:12:12",
  121. "message" : "trying out Elasticsearch"
  122. }
  123. }
  124. ]
  125. }
  126. }`), &result)
  127. }
  128. }