jsoniter_object_test.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package jsoniter
  2. import (
  3. "testing"
  4. "encoding/json"
  5. "fmt"
  6. )
  7. func Test_empty_object(t *testing.T) {
  8. iter := ParseString(`{}`)
  9. field := iter.ReadObject()
  10. if field != "" {
  11. t.Fatal(field)
  12. }
  13. }
  14. func Test_one_field(t *testing.T) {
  15. iter := ParseString(`{"a": "b"}`)
  16. field := iter.ReadObject()
  17. if field != "a" {
  18. fmt.Println(iter.Error)
  19. t.Fatal(field)
  20. }
  21. value := iter.ReadString()
  22. if value != "b" {
  23. t.Fatal(field)
  24. }
  25. field = iter.ReadObject()
  26. if field != "" {
  27. t.Fatal(field)
  28. }
  29. }
  30. func Test_two_field(t *testing.T) {
  31. iter := ParseString(`{ "a": "b" , "c": "d" }`)
  32. field := iter.ReadObject()
  33. if field != "a" {
  34. t.Fatal(field)
  35. }
  36. value := iter.ReadString()
  37. if value != "b" {
  38. t.Fatal(field)
  39. }
  40. field = iter.ReadObject()
  41. if field != "c" {
  42. t.Fatal(field)
  43. }
  44. value = iter.ReadString()
  45. if value != "d" {
  46. t.Fatal(field)
  47. }
  48. field = iter.ReadObject()
  49. if field != "" {
  50. t.Fatal(field)
  51. }
  52. iter = ParseString(`{"field1": "1", "field2": 2}`)
  53. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  54. switch field {
  55. case "field1":
  56. iter.ReadString()
  57. case "field2":
  58. iter.ReadInt64()
  59. default:
  60. iter.ReportError("bind object", "unexpected field")
  61. }
  62. }
  63. }
  64. func Test_cb(t *testing.T) {
  65. iter := ParseString(`{ "a": "b" , "c": "d" }`)
  66. count := 0
  67. iter.ReadObjectCB(func(field string) {
  68. iter.Skip()
  69. count += 1
  70. })
  71. if count != 2 {
  72. t.Fatal(count)
  73. }
  74. }
  75. type TestObj struct {
  76. Field1 string
  77. Field2 uint64
  78. }
  79. func Benchmark_jsoniter_object(b *testing.B) {
  80. for n := 0; n < b.N; n++ {
  81. iter := ParseString(`{"field1": "1", "field2": 2}`)
  82. obj := TestObj{}
  83. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  84. switch field {
  85. case "field1":
  86. obj.Field1 = iter.ReadString()
  87. case "field2":
  88. obj.Field2 = iter.ReadUint64()
  89. default:
  90. iter.ReportError("bind object", "unexpected field")
  91. }
  92. }
  93. }
  94. }
  95. func Benchmark_jsoniter_cb(b *testing.B) {
  96. for n := 0; n < b.N; n++ {
  97. iter := ParseString(`{"field1": "1", "field2": 2}`)
  98. obj := TestObj{}
  99. iter.ReadObjectCB(func(field string) {
  100. switch field {
  101. case "field1":
  102. obj.Field1 = iter.ReadString()
  103. case "field2":
  104. obj.Field2 = iter.ReadUint64()
  105. default:
  106. iter.ReportError("bind object", "unexpected field")
  107. }
  108. })
  109. }
  110. }
  111. func Benchmark_json_object(b *testing.B) {
  112. for n := 0; n < b.N; n++ {
  113. result := TestObj{}
  114. json.Unmarshal([]byte(`{"field1": "1", "field2": 2}`), &result)
  115. }
  116. }