jsoniter_any_object_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package jsoniter
  2. import (
  3. "testing"
  4. "github.com/json-iterator/go/require"
  5. )
  6. func Test_read_object_as_any(t *testing.T) {
  7. should := require.New(t)
  8. any, err := UnmarshalAnyFromString(`{"a":"b","c":"d"}`)
  9. should.Nil(err)
  10. should.Equal(`{"a":"b","c":"d"}`, any.ToString())
  11. // partial parse
  12. should.Equal("b", any.Get("a").ToString())
  13. should.Equal("d", any.Get("c").ToString())
  14. should.Equal(2, len(any.Keys()))
  15. any, err = UnmarshalAnyFromString(`{"a":"b","c":"d"}`)
  16. // full parse
  17. should.Equal(2, len(any.Keys()))
  18. should.Equal(2, any.Size())
  19. should.True(any.ToBool())
  20. should.Equal(1, any.ToInt())
  21. }
  22. func Test_object_any_lazy_iterator(t *testing.T) {
  23. should := require.New(t)
  24. any, err := UnmarshalAnyFromString(`{"a":"b","c":"d"}`)
  25. should.Nil(err)
  26. // iterator parse
  27. vals := map[string]string{}
  28. var k string
  29. var v Any
  30. next, hasNext := any.IterateObject()
  31. should.True(hasNext)
  32. k, v, hasNext = next()
  33. should.True(hasNext)
  34. vals[k] = v.ToString()
  35. // trigger full parse
  36. should.Equal(2, len(any.Keys()))
  37. k, v, hasNext = next()
  38. should.False(hasNext)
  39. vals[k] = v.ToString()
  40. should.Equal(map[string]string{"a": "b", "c": "d"}, vals)
  41. vals = map[string]string{}
  42. for next, hasNext := any.IterateObject(); hasNext; {
  43. k, v, hasNext = next()
  44. if v.ValueType() == String {
  45. vals[k] = v.ToString()
  46. }
  47. }
  48. should.Equal(map[string]string{"a": "b", "c": "d"}, vals)
  49. }
  50. func Test_object_any_with_two_lazy_iterators(t *testing.T) {
  51. should := require.New(t)
  52. any, err := UnmarshalAnyFromString(`{"a":"b","c":"d","e":"f"}`)
  53. should.Nil(err)
  54. var k string
  55. var v Any
  56. next1, hasNext1 := any.IterateObject()
  57. next2, hasNext2 := any.IterateObject()
  58. should.True(hasNext1)
  59. k, v, hasNext1 = next1()
  60. should.True(hasNext1)
  61. should.Equal("a", k)
  62. should.Equal("b", v.ToString())
  63. should.True(hasNext2)
  64. k, v, hasNext2 = next2()
  65. should.True(hasNext2)
  66. should.Equal("a", k)
  67. should.Equal("b", v.ToString())
  68. k, v, hasNext1 = next1()
  69. should.True(hasNext1)
  70. should.Equal("c", k)
  71. should.Equal("d", v.ToString())
  72. k, v, hasNext2 = next2()
  73. should.True(hasNext2)
  74. should.Equal("c", k)
  75. should.Equal("d", v.ToString())
  76. }
  77. func Test_object_lazy_any_get(t *testing.T) {
  78. should := require.New(t)
  79. any, err := UnmarshalAnyFromString(`{"a":{"b":{"c":"d"}}}`)
  80. should.Nil(err)
  81. should.Equal("d", any.Get("a", "b", "c").ToString())
  82. }
  83. func Test_object_lazy_any_get_all(t *testing.T) {
  84. should := require.New(t)
  85. any, err := UnmarshalAnyFromString(`{"a":[0],"b":[1]}`)
  86. should.Nil(err)
  87. should.Contains(any.Get('*', 0).ToString(), `"a":0`)
  88. }
  89. func Test_object_lazy_any_get_invalid(t *testing.T) {
  90. should := require.New(t)
  91. any, err := UnmarshalAnyFromString(`{}`)
  92. should.Nil(err)
  93. should.Equal(Invalid, any.Get("a", "b", "c").ValueType())
  94. should.Equal(Invalid, any.Get(1).ValueType())
  95. }
  96. func Test_object_lazy_any_set(t *testing.T) {
  97. should := require.New(t)
  98. any, err := UnmarshalAnyFromString(`{"a":{"b":{"c":"d"}}}`)
  99. should.Nil(err)
  100. any.GetObject()["a"] = WrapInt64(1)
  101. str, err := MarshalToString(any)
  102. should.Nil(err)
  103. should.Equal(`{"a":1}`, str)
  104. }
  105. func Test_wrap_object(t *testing.T) {
  106. should := require.New(t)
  107. type TestObject struct {
  108. Field1 string
  109. field2 string
  110. }
  111. any := Wrap(TestObject{"hello", "world"})
  112. should.Equal("hello", any.Get("Field1").ToString())
  113. any = Wrap(TestObject{"hello", "world"})
  114. should.Equal(2, any.Size())
  115. any = Wrap(TestObject{"hello", "world"})
  116. vals := map[string]string{}
  117. var k string
  118. var v Any
  119. for next, hasNext := any.IterateObject(); hasNext; {
  120. k, v, hasNext = next()
  121. if v.ValueType() == String {
  122. vals[k] = v.ToString()
  123. }
  124. }
  125. should.Equal(map[string]string{"Field1": "hello"}, vals)
  126. }
  127. func Test_any_within_struct(t *testing.T) {
  128. should := require.New(t)
  129. type TestObject struct {
  130. Field1 Any
  131. Field2 Any
  132. }
  133. obj := TestObject{}
  134. err := UnmarshalFromString(`{"Field1": "hello", "Field2": [1,2,3]}`, &obj)
  135. should.Nil(err)
  136. should.Equal("hello", obj.Field1.ToString())
  137. should.Equal("[1,2,3]", obj.Field2.ToString())
  138. }