jsoniter_interface_test.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. package misc_tests
  2. import (
  3. "encoding/json"
  4. "github.com/json-iterator/go"
  5. "github.com/stretchr/testify/require"
  6. "io"
  7. "testing"
  8. )
  9. func Test_nil_non_empty_interface(t *testing.T) {
  10. type TestObject struct {
  11. Field []io.Closer
  12. }
  13. should := require.New(t)
  14. obj := TestObject{}
  15. b := []byte(`{"Field":["AAA"]}`)
  16. should.NotNil(json.Unmarshal(b, &obj))
  17. should.NotNil(jsoniter.Unmarshal(b, &obj))
  18. }
  19. func Test_nil_out_null_interface(t *testing.T) {
  20. type TestData struct {
  21. Field interface{} `json:"field"`
  22. }
  23. should := require.New(t)
  24. var boolVar bool
  25. obj := TestData{
  26. Field: &boolVar,
  27. }
  28. data1 := []byte(`{"field": true}`)
  29. err := jsoniter.Unmarshal(data1, &obj)
  30. should.NoError(err)
  31. should.Equal(true, *(obj.Field.(*bool)))
  32. data2 := []byte(`{"field": null}`)
  33. err = jsoniter.Unmarshal(data2, &obj)
  34. should.NoError(err)
  35. should.Nil(obj.Field)
  36. // Checking stdlib behavior matches.
  37. obj2 := TestData{
  38. Field: &boolVar,
  39. }
  40. err = json.Unmarshal(data1, &obj2)
  41. should.NoError(err)
  42. should.Equal(true, *(obj2.Field.(*bool)))
  43. err = json.Unmarshal(data2, &obj2)
  44. should.NoError(err)
  45. should.Equal(nil, obj2.Field)
  46. }
  47. func Test_overwrite_interface_ptr_value_with_nil(t *testing.T) {
  48. type Wrapper struct {
  49. Payload interface{} `json:"payload,omitempty"`
  50. }
  51. type Payload struct {
  52. Value int `json:"val,omitempty"`
  53. }
  54. should := require.New(t)
  55. payload := &Payload{}
  56. wrapper := &Wrapper{
  57. Payload: &payload,
  58. }
  59. err := json.Unmarshal([]byte(`{"payload": {"val": 42}}`), &wrapper)
  60. should.NoError(err)
  61. should.Equal(&payload, wrapper.Payload)
  62. should.Equal(42, (*(wrapper.Payload.(**Payload))).Value)
  63. err = json.Unmarshal([]byte(`{"payload": null}`), &wrapper)
  64. should.NoError(err)
  65. should.Equal(&payload, wrapper.Payload)
  66. should.Equal((*Payload)(nil), payload)
  67. payload = &Payload{}
  68. wrapper = &Wrapper{
  69. Payload: &payload,
  70. }
  71. err = jsoniter.Unmarshal([]byte(`{"payload": {"val": 42}}`), &wrapper)
  72. should.Equal(nil, err)
  73. should.Equal(&payload, wrapper.Payload)
  74. should.Equal(42, (*(wrapper.Payload.(**Payload))).Value)
  75. err = jsoniter.Unmarshal([]byte(`{"payload": null}`), &wrapper)
  76. should.NoError(err)
  77. should.Equal(&payload, wrapper.Payload)
  78. should.Equal((*Payload)(nil), payload)
  79. }
  80. func Test_overwrite_interface_value_with_nil(t *testing.T) {
  81. type Wrapper struct {
  82. Payload interface{} `json:"payload,omitempty"`
  83. }
  84. type Payload struct {
  85. Value int `json:"val,omitempty"`
  86. }
  87. should := require.New(t)
  88. payload := &Payload{}
  89. wrapper := &Wrapper{
  90. Payload: payload,
  91. }
  92. err := json.Unmarshal([]byte(`{"payload": {"val": 42}}`), &wrapper)
  93. should.NoError(err)
  94. should.Equal(42, (*(wrapper.Payload.(*Payload))).Value)
  95. err = json.Unmarshal([]byte(`{"payload": null}`), &wrapper)
  96. should.NoError(err)
  97. should.Equal(nil, wrapper.Payload)
  98. should.Equal(42, payload.Value)
  99. payload = &Payload{}
  100. wrapper = &Wrapper{
  101. Payload: payload,
  102. }
  103. err = jsoniter.Unmarshal([]byte(`{"payload": {"val": 42}}`), &wrapper)
  104. should.Equal(nil, err)
  105. should.Equal(42, (*(wrapper.Payload.(*Payload))).Value)
  106. err = jsoniter.Unmarshal([]byte(`{"payload": null}`), &wrapper)
  107. should.Equal(nil, err)
  108. should.Equal(nil, wrapper.Payload)
  109. should.Equal(42, payload.Value)
  110. }
  111. func Test_unmarshal_into_nil(t *testing.T) {
  112. type Payload struct {
  113. Value int `json:"val,omitempty"`
  114. }
  115. type Wrapper struct {
  116. Payload interface{} `json:"payload,omitempty"`
  117. }
  118. should := require.New(t)
  119. var payload *Payload
  120. wrapper := &Wrapper{
  121. Payload: payload,
  122. }
  123. err := json.Unmarshal([]byte(`{"payload": {"val": 42}}`), &wrapper)
  124. should.NoError(err)
  125. should.NotNil(wrapper.Payload)
  126. should.Nil(payload)
  127. err = json.Unmarshal([]byte(`{"payload": null}`), &wrapper)
  128. should.NoError(err)
  129. should.Nil(wrapper.Payload)
  130. should.Nil(payload)
  131. payload = nil
  132. wrapper = &Wrapper{
  133. Payload: payload,
  134. }
  135. err = jsoniter.Unmarshal([]byte(`{"payload": {"val": 42}}`), &wrapper)
  136. should.NoError(err)
  137. should.NotNil(wrapper.Payload)
  138. should.Nil(payload)
  139. err = jsoniter.Unmarshal([]byte(`{"payload": null}`), &wrapper)
  140. should.NoError(err)
  141. should.Nil(wrapper.Payload)
  142. should.Nil(payload)
  143. }