jsoniter_object_test.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package jsoniter
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "testing"
  6. "github.com/json-iterator/go/require"
  7. "bytes"
  8. )
  9. func Test_empty_object(t *testing.T) {
  10. iter := ParseString(`{}`)
  11. field := iter.ReadObject()
  12. if field != "" {
  13. t.Fatal(field)
  14. }
  15. }
  16. func Test_one_field(t *testing.T) {
  17. iter := ParseString(`{"a": "b"}`)
  18. field := iter.ReadObject()
  19. if field != "a" {
  20. fmt.Println(iter.Error)
  21. t.Fatal(field)
  22. }
  23. value := iter.ReadString()
  24. if value != "b" {
  25. t.Fatal(field)
  26. }
  27. field = iter.ReadObject()
  28. if field != "" {
  29. t.Fatal(field)
  30. }
  31. }
  32. func Test_two_field(t *testing.T) {
  33. iter := ParseString(`{ "a": "b" , "c": "d" }`)
  34. field := iter.ReadObject()
  35. if field != "a" {
  36. t.Fatal(field)
  37. }
  38. value := iter.ReadString()
  39. if value != "b" {
  40. t.Fatal(field)
  41. }
  42. field = iter.ReadObject()
  43. if field != "c" {
  44. t.Fatal(field)
  45. }
  46. value = iter.ReadString()
  47. if value != "d" {
  48. t.Fatal(field)
  49. }
  50. field = iter.ReadObject()
  51. if field != "" {
  52. t.Fatal(field)
  53. }
  54. iter = ParseString(`{"field1": "1", "field2": 2}`)
  55. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  56. switch field {
  57. case "field1":
  58. iter.ReadString()
  59. case "field2":
  60. iter.ReadInt64()
  61. default:
  62. iter.reportError("bind object", "unexpected field")
  63. }
  64. }
  65. }
  66. func Test_write_object(t *testing.T) {
  67. should := require.New(t)
  68. buf := &bytes.Buffer{}
  69. stream := NewStream(buf, 4096)
  70. stream.IndentionStep = 2
  71. stream.WriteObjectStart()
  72. stream.WriteObjectField("hello")
  73. stream.WriteInt(1)
  74. stream.WriteMore()
  75. stream.WriteObjectField("world")
  76. stream.WriteInt(2)
  77. stream.WriteObjectEnd()
  78. stream.Flush()
  79. should.Nil(stream.Error)
  80. should.Equal("{\n hello:1,\n world:2\n}", buf.String())
  81. }
  82. type TestObj struct {
  83. Field1 string
  84. Field2 uint64
  85. }
  86. func Benchmark_jsoniter_object(b *testing.B) {
  87. for n := 0; n < b.N; n++ {
  88. iter := ParseString(`{"field1": "1", "field2": 2}`)
  89. obj := TestObj{}
  90. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  91. switch field {
  92. case "field1":
  93. obj.Field1 = iter.ReadString()
  94. case "field2":
  95. obj.Field2 = iter.ReadUint64()
  96. default:
  97. iter.reportError("bind object", "unexpected field")
  98. }
  99. }
  100. }
  101. }
  102. func Benchmark_json_object(b *testing.B) {
  103. for n := 0; n < b.N; n++ {
  104. result := TestObj{}
  105. json.Unmarshal([]byte(`{"field1": "1", "field2": 2}`), &result)
  106. }
  107. }