jsoniter_object_test.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package jsoniter
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "testing"
  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. type TestObj struct {
  65. Field1 string
  66. Field2 uint64
  67. }
  68. func Benchmark_jsoniter_object(b *testing.B) {
  69. for n := 0; n < b.N; n++ {
  70. iter := ParseString(`{"field1": "1", "field2": 2}`)
  71. obj := TestObj{}
  72. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  73. switch field {
  74. case "field1":
  75. obj.Field1 = iter.ReadString()
  76. case "field2":
  77. obj.Field2 = iter.ReadUint64()
  78. default:
  79. iter.reportError("bind object", "unexpected field")
  80. }
  81. }
  82. }
  83. }
  84. func Benchmark_json_object(b *testing.B) {
  85. for n := 0; n < b.N; n++ {
  86. result := TestObj{}
  87. json.Unmarshal([]byte(`{"field1": "1", "field2": 2}`), &result)
  88. }
  89. }