jsoniter_nested_test.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package jsoniter
  2. import (
  3. "testing"
  4. "reflect"
  5. "encoding/json"
  6. )
  7. type Level1 struct {
  8. Hello []Level2
  9. }
  10. type Level2 struct {
  11. World string
  12. }
  13. func Test_nested(t *testing.T) {
  14. iter := ParseString(`{"hello": [{"world": "value1"}, {"world": "value2"}]}`)
  15. l1 := Level1{}
  16. for l1Field := iter.ReadObject(); l1Field != ""; l1Field = iter.ReadObject() {
  17. switch l1Field {
  18. case "hello":
  19. l2Array := []Level2{}
  20. for iter.ReadArray() {
  21. l2 := Level2{}
  22. for l2Field := iter.ReadObject(); l2Field != ""; l2Field = iter.ReadObject() {
  23. switch l2Field {
  24. case "world":
  25. l2.World = iter.ReadString()
  26. default:
  27. iter.ReportError("bind l2", "unexpected field: " + l2Field)
  28. }
  29. }
  30. l2Array = append(l2Array, l2)
  31. }
  32. l1.Hello = l2Array
  33. default:
  34. iter.ReportError("bind l1", "unexpected field: " + l1Field)
  35. }
  36. }
  37. if !reflect.DeepEqual(l1, Level1{
  38. Hello: []Level2{
  39. {World: "value1"},
  40. {World: "value2"},
  41. },
  42. }) {
  43. t.Fatal(l1)
  44. }
  45. }
  46. func Benchmark_jsoniter_nested(b *testing.B) {
  47. for n := 0; n < b.N; n++ {
  48. iter := ParseString(`{"hello": [{"world": "value1"}, {"world": "value2"}]}`)
  49. l1 := Level1{}
  50. for l1Field := iter.ReadObject(); l1Field != ""; l1Field = iter.ReadObject() {
  51. switch l1Field {
  52. case "hello":
  53. l2Array := make([]Level2, 0, 2)
  54. for iter.ReadArray() {
  55. l2 := Level2{}
  56. for l2Field := iter.ReadObject(); l2Field != ""; l2Field = iter.ReadObject() {
  57. switch l2Field {
  58. case "world":
  59. l2.World = iter.ReadString()
  60. default:
  61. iter.ReportError("bind l2", "unexpected field: " + l2Field)
  62. }
  63. }
  64. l2Array = append(l2Array, l2)
  65. }
  66. l1.Hello = l2Array
  67. default:
  68. iter.ReportError("bind l1", "unexpected field: " + l1Field)
  69. }
  70. }
  71. }
  72. }
  73. func Benchmark_json_nested(b *testing.B) {
  74. for n := 0; n < b.N; n++ {
  75. l1 := Level1{}
  76. json.Unmarshal([]byte(`{"hello": [{"world": "value1"}, {"world": "value2"}]}`), &l1)
  77. }
  78. }