jsoniter_interface_test.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. package misc_tests
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "testing"
  6. "github.com/stretchr/testify/require"
  7. "github.com/json-iterator/go"
  8. )
  9. type MyInterface interface {
  10. Hello() string
  11. }
  12. type MyString string
  13. func (ms MyString) Hello() string {
  14. return string(ms)
  15. }
  16. func Test_decode_object_contain_non_empty_interface(t *testing.T) {
  17. type TestObject struct {
  18. Field MyInterface
  19. }
  20. should := require.New(t)
  21. obj := TestObject{}
  22. obj.Field = MyString("abc")
  23. should.Nil(jsoniter.UnmarshalFromString(`{"Field": "hello"}`, &obj))
  24. should.Equal(MyString("hello"), obj.Field)
  25. }
  26. func Test_nil_non_empty_interface(t *testing.T) {
  27. type TestObject struct {
  28. Field []MyInterface
  29. }
  30. should := require.New(t)
  31. obj := TestObject{}
  32. b := []byte(`{"Field":["AAA"]}`)
  33. should.NotNil(json.Unmarshal(b, &obj))
  34. should.NotNil(jsoniter.Unmarshal(b, &obj))
  35. }
  36. func Test_read_large_number_as_interface(t *testing.T) {
  37. should := require.New(t)
  38. var val interface{}
  39. err := jsoniter.Config{UseNumber: true}.Froze().UnmarshalFromString(`123456789123456789123456789`, &val)
  40. should.Nil(err)
  41. output, err := jsoniter.MarshalToString(val)
  42. should.Nil(err)
  43. should.Equal(`123456789123456789123456789`, output)
  44. }
  45. func Test_unmarshal_ptr_to_interface(t *testing.T) {
  46. type TestData struct {
  47. Name string `json:"name"`
  48. }
  49. should := require.New(t)
  50. var obj interface{} = &TestData{}
  51. err := json.Unmarshal([]byte(`{"name":"value"}`), &obj)
  52. should.Nil(err)
  53. should.Equal("&{value}", fmt.Sprintf("%v", obj))
  54. obj = interface{}(&TestData{})
  55. err = jsoniter.Unmarshal([]byte(`{"name":"value"}`), &obj)
  56. should.Nil(err)
  57. should.Equal("&{value}", fmt.Sprintf("%v", obj))
  58. }
  59. func Test_nil_out_null_interface(t *testing.T) {
  60. type TestData struct {
  61. Field interface{} `json:"field"`
  62. }
  63. should := require.New(t)
  64. var boolVar bool
  65. obj := TestData{
  66. Field: &boolVar,
  67. }
  68. data1 := []byte(`{"field": true}`)
  69. err := jsoniter.Unmarshal(data1, &obj)
  70. should.NoError(err)
  71. should.Equal(true, *(obj.Field.(*bool)))
  72. data2 := []byte(`{"field": null}`)
  73. err = jsoniter.Unmarshal(data2, &obj)
  74. should.NoError(err)
  75. should.Equal(nil, obj.Field)
  76. // Checking stdlib behavior matches.
  77. obj2 := TestData{
  78. Field: &boolVar,
  79. }
  80. err = json.Unmarshal(data1, &obj2)
  81. should.NoError(err)
  82. should.Equal(true, *(obj2.Field.(*bool)))
  83. err = json.Unmarshal(data2, &obj2)
  84. should.NoError(err)
  85. should.Equal(nil, obj2.Field)
  86. }
  87. func Test_overwrite_interface_ptr_value_with_nil(t *testing.T) {
  88. type Wrapper struct {
  89. Payload interface{} `json:"payload,omitempty"`
  90. }
  91. type Payload struct {
  92. Value int `json:"val,omitempty"`
  93. }
  94. should := require.New(t)
  95. payload := &Payload{}
  96. wrapper := &Wrapper{
  97. Payload: &payload,
  98. }
  99. err := json.Unmarshal([]byte(`{"payload": {"val": 42}}`), &wrapper)
  100. should.Equal(nil, err)
  101. should.Equal(&payload, wrapper.Payload)
  102. should.Equal(42, (*(wrapper.Payload.(**Payload))).Value)
  103. err = json.Unmarshal([]byte(`{"payload": null}`), &wrapper)
  104. should.Equal(nil, err)
  105. should.Equal(&payload, wrapper.Payload)
  106. should.Equal((*Payload)(nil), payload)
  107. payload = &Payload{}
  108. wrapper = &Wrapper{
  109. Payload: &payload,
  110. }
  111. err = jsoniter.Unmarshal([]byte(`{"payload": {"val": 42}}`), &wrapper)
  112. should.Equal(nil, err)
  113. should.Equal(&payload, wrapper.Payload)
  114. should.Equal(42, (*(wrapper.Payload.(**Payload))).Value)
  115. err = jsoniter.Unmarshal([]byte(`{"payload": null}`), &wrapper)
  116. should.Equal(nil, err)
  117. should.Equal(&payload, wrapper.Payload)
  118. should.Equal((*Payload)(nil), payload)
  119. }
  120. func Test_overwrite_interface_value_with_nil(t *testing.T) {
  121. type Wrapper struct {
  122. Payload interface{} `json:"payload,omitempty"`
  123. }
  124. type Payload struct {
  125. Value int `json:"val,omitempty"`
  126. }
  127. should := require.New(t)
  128. payload := &Payload{}
  129. wrapper := &Wrapper{
  130. Payload: payload,
  131. }
  132. err := json.Unmarshal([]byte(`{"payload": {"val": 42}}`), &wrapper)
  133. should.Equal(nil, err)
  134. should.Equal(42, (*(wrapper.Payload.(*Payload))).Value)
  135. err = json.Unmarshal([]byte(`{"payload": null}`), &wrapper)
  136. should.Equal(nil, err)
  137. should.Equal(nil, wrapper.Payload)
  138. should.Equal(42, payload.Value)
  139. payload = &Payload{}
  140. wrapper = &Wrapper{
  141. Payload: payload,
  142. }
  143. err = jsoniter.Unmarshal([]byte(`{"payload": {"val": 42}}`), &wrapper)
  144. should.Equal(nil, err)
  145. should.Equal(42, (*(wrapper.Payload.(*Payload))).Value)
  146. err = jsoniter.Unmarshal([]byte(`{"payload": null}`), &wrapper)
  147. should.Equal(nil, err)
  148. should.Equal(nil, wrapper.Payload)
  149. should.Equal(42, payload.Value)
  150. }
  151. func Test_unmarshal_into_nil(t *testing.T) {
  152. type Payload struct {
  153. Value int `json:"val,omitempty"`
  154. }
  155. type Wrapper struct {
  156. Payload interface{} `json:"payload,omitempty"`
  157. }
  158. should := require.New(t)
  159. var payload *Payload
  160. wrapper := &Wrapper{
  161. Payload: payload,
  162. }
  163. err := json.Unmarshal([]byte(`{"payload": {"val": 42}}`), &wrapper)
  164. should.Nil(err)
  165. should.NotNil(wrapper.Payload)
  166. should.Nil(payload)
  167. err = json.Unmarshal([]byte(`{"payload": null}`), &wrapper)
  168. should.Nil(err)
  169. should.Nil(wrapper.Payload)
  170. should.Nil(payload)
  171. payload = nil
  172. wrapper = &Wrapper{
  173. Payload: payload,
  174. }
  175. err = jsoniter.Unmarshal([]byte(`{"payload": {"val": 42}}`), &wrapper)
  176. should.Nil(err)
  177. should.NotNil(wrapper.Payload)
  178. should.Nil(payload)
  179. err = jsoniter.Unmarshal([]byte(`{"payload": null}`), &wrapper)
  180. should.Nil(err)
  181. should.Nil(wrapper.Payload)
  182. should.Nil(payload)
  183. }