jsoniter_raw_message_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package jsoniter
  2. import (
  3. "encoding/json"
  4. "github.com/stretchr/testify/require"
  5. "strings"
  6. "testing"
  7. )
  8. func Test_json_RawMessage(t *testing.T) {
  9. should := require.New(t)
  10. var data json.RawMessage
  11. should.Nil(Unmarshal([]byte(`[1,2,3]`), &data))
  12. should.Equal(`[1,2,3]`, string(data))
  13. str, err := MarshalToString(data)
  14. should.Nil(err)
  15. should.Equal(`[1,2,3]`, str)
  16. }
  17. func Test_jsoniter_RawMessage(t *testing.T) {
  18. should := require.New(t)
  19. var data RawMessage
  20. should.Nil(Unmarshal([]byte(`[1,2,3]`), &data))
  21. should.Equal(`[1,2,3]`, string(data))
  22. str, err := MarshalToString(data)
  23. should.Nil(err)
  24. should.Equal(`[1,2,3]`, str)
  25. }
  26. func Test_json_RawMessage_in_struct(t *testing.T) {
  27. type TestObject struct {
  28. Field1 string
  29. Field2 json.RawMessage
  30. }
  31. should := require.New(t)
  32. var data TestObject
  33. should.Nil(Unmarshal([]byte(`{"field1": "hello", "field2": [1,2,3]}`), &data))
  34. should.Equal(` [1,2,3]`, string(data.Field2))
  35. should.Equal(`hello`, data.Field1)
  36. }
  37. func Test_decode_map_of_raw_message(t *testing.T) {
  38. should := require.New(t)
  39. type RawMap map[string]*json.RawMessage
  40. b := []byte("{\"test\":[{\"key\":\"value\"}]}")
  41. var rawMap RawMap
  42. should.Nil(Unmarshal(b, &rawMap))
  43. should.Equal(`[{"key":"value"}]`, string(*rawMap["test"]))
  44. type Inner struct {
  45. Key string `json:"key"`
  46. }
  47. var inner []Inner
  48. Unmarshal(*rawMap["test"], &inner)
  49. should.Equal("value", inner[0].Key)
  50. }
  51. func Test_encode_map_of_raw_message(t *testing.T) {
  52. should := require.New(t)
  53. type RawMap map[string]*json.RawMessage
  54. value := json.RawMessage("[]")
  55. rawMap := RawMap{"hello": &value}
  56. output, err := MarshalToString(rawMap)
  57. should.Nil(err)
  58. should.Equal(`{"hello":[]}`, output)
  59. }
  60. func Test_encode_map_of_jsoniter_raw_message(t *testing.T) {
  61. should := require.New(t)
  62. type RawMap map[string]*RawMessage
  63. value := RawMessage("[]")
  64. rawMap := RawMap{"hello": &value}
  65. output, err := MarshalToString(rawMap)
  66. should.Nil(err)
  67. should.Equal(`{"hello":[]}`, output)
  68. }
  69. func Test_marshal_invalid_json_raw_message(t *testing.T) {
  70. type A struct {
  71. Raw json.RawMessage `json:"raw"`
  72. }
  73. message := []byte(`{}`)
  74. a := A{}
  75. should := require.New(t)
  76. should.Nil(ConfigCompatibleWithStandardLibrary.Unmarshal(message, &a))
  77. aout, aouterr := ConfigCompatibleWithStandardLibrary.Marshal(&a)
  78. should.Equal(`{"raw":null}`, string(aout))
  79. should.Nil(aouterr)
  80. }
  81. func Test_raw_message_memory_not_copied_issue(t *testing.T) {
  82. jsonStream := `{"name":"xxxxx","bundle_id":"com.zonst.majiang","app_platform":"ios","app_category":"100103", "budget_day":1000,"bidding_min":1,"bidding_max":2,"bidding_type":"CPM", "freq":{"open":true,"type":"day","num":100},"speed":1, "targeting":{"vendor":{"open":true,"list":["zonst"]}, "geo_code":{"open":true,"list":["156110100"]},"app_category":{"open":true,"list":["100101"]}, "day_parting":{"open":true,"list":["100409","100410"]},"device_type":{"open":true,"list":["ipad"]}, "os_version":{"open":true,"list":[10]},"carrier":{"open":true,"list":["mobile"]}, "network":{"open":true,"list":["4G"]}},"url":{"tracking_imp_url":"http://www.baidu.com", "tracking_clk_url":"http://www.baidu.com","jump_url":"http://www.baidu.com","deep_link_url":"http://www.baidu.com"}}`
  83. type IteratorObject struct {
  84. Name *string `json:"name"`
  85. BundleId *string `json:"bundle_id"`
  86. AppCategory *string `json:"app_category"`
  87. AppPlatform *string `json:"app_platform"`
  88. BudgetDay *float32 `json:"budget_day"`
  89. BiddingMax *float32 `json:"bidding_max"`
  90. BiddingMin *float32 `json:"bidding_min"`
  91. BiddingType *string `json:"bidding_type"`
  92. Freq *RawMessage `json:"freq"`
  93. Targeting *RawMessage `json:"targeting"`
  94. Url *RawMessage `json:"url"`
  95. Speed *int `json:"speed" db:"speed"`
  96. }
  97. obj := &IteratorObject{}
  98. decoder := NewDecoder(strings.NewReader(jsonStream))
  99. err := decoder.Decode(obj)
  100. should := require.New(t)
  101. should.Nil(err)
  102. should.Equal(`{"open":true,"type":"day","num":100}`, string(*obj.Freq))
  103. }