jsoniter_object_test.go 1.8 KB

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