jsoniter_object_test.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  1. package jsoniter
  2. import (
  3. "bytes"
  4. "fmt"
  5. "github.com/json-iterator/go/require"
  6. "testing"
  7. )
  8. func Test_empty_object(t *testing.T) {
  9. should := require.New(t)
  10. iter := ParseString(ConfigDefault, `{}`)
  11. field := iter.ReadObject()
  12. should.Equal("", field)
  13. iter = ParseString(ConfigDefault, `{}`)
  14. iter.ReadObjectCB(func(iter *Iterator, field string) bool {
  15. should.FailNow("should not call")
  16. return true
  17. })
  18. }
  19. func Test_one_field(t *testing.T) {
  20. should := require.New(t)
  21. iter := ParseString(ConfigDefault, `{"a": "b"}`)
  22. field := iter.ReadObject()
  23. should.Equal("a", field)
  24. value := iter.ReadString()
  25. should.Equal("b", value)
  26. field = iter.ReadObject()
  27. should.Equal("", field)
  28. iter = ParseString(ConfigDefault, `{"a": "b"}`)
  29. should.True(iter.ReadObjectCB(func(iter *Iterator, field string) bool {
  30. should.Equal("a", field)
  31. return true
  32. }))
  33. }
  34. func Test_two_field(t *testing.T) {
  35. should := require.New(t)
  36. iter := ParseString(ConfigDefault, `{ "a": "b" , "c": "d" }`)
  37. field := iter.ReadObject()
  38. should.Equal("a", field)
  39. value := iter.ReadString()
  40. should.Equal("b", value)
  41. field = iter.ReadObject()
  42. should.Equal("c", field)
  43. value = iter.ReadString()
  44. should.Equal("d", value)
  45. field = iter.ReadObject()
  46. should.Equal("", field)
  47. iter = ParseString(ConfigDefault, `{"field1": "1", "field2": 2}`)
  48. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  49. switch field {
  50. case "field1":
  51. iter.ReadString()
  52. case "field2":
  53. iter.ReadInt64()
  54. default:
  55. iter.ReportError("bind object", "unexpected field")
  56. }
  57. }
  58. }
  59. func Test_object_wrapper_any_get_all(t *testing.T) {
  60. should := require.New(t)
  61. type TestObject struct {
  62. Field1 []int
  63. Field2 []int
  64. }
  65. any := Wrap(TestObject{[]int{1, 2}, []int{3, 4}})
  66. should.Contains(any.Get('*', 0).ToString(), `"Field2":3`)
  67. }
  68. func Test_write_object(t *testing.T) {
  69. should := require.New(t)
  70. buf := &bytes.Buffer{}
  71. stream := NewStream(Config{IndentionStep: 2}.Froze(), buf, 4096)
  72. stream.WriteObjectStart()
  73. stream.WriteObjectField("hello")
  74. stream.WriteInt(1)
  75. stream.WriteMore()
  76. stream.WriteObjectField("world")
  77. stream.WriteInt(2)
  78. stream.WriteObjectEnd()
  79. stream.Flush()
  80. should.Nil(stream.Error)
  81. should.Equal("{\n \"hello\": 1,\n \"world\": 2\n}", buf.String())
  82. }
  83. func Test_decode_one_field_struct(t *testing.T) {
  84. should := require.New(t)
  85. type TestObject struct {
  86. Field1 string
  87. }
  88. obj := TestObject{}
  89. should.Nil(UnmarshalFromString(`{}`, &obj))
  90. should.Equal("", obj.Field1)
  91. should.Nil(UnmarshalFromString(`{"field1": "hello"}`, &obj))
  92. should.Equal("hello", obj.Field1)
  93. }
  94. func Test_decode_two_fields_struct(t *testing.T) {
  95. should := require.New(t)
  96. type TestObject struct {
  97. Field1 string
  98. Field2 string
  99. }
  100. obj := TestObject{}
  101. should.Nil(UnmarshalFromString(`{}`, &obj))
  102. should.Equal("", obj.Field1)
  103. should.Nil(UnmarshalFromString(`{"Field1": "a", "Field2": "b"}`, &obj))
  104. should.Equal("a", obj.Field1)
  105. should.Equal("b", obj.Field2)
  106. }
  107. func Test_decode_three_fields_struct(t *testing.T) {
  108. should := require.New(t)
  109. type TestObject struct {
  110. Field1 string
  111. Field2 string
  112. Field3 string
  113. }
  114. obj := TestObject{}
  115. should.Nil(UnmarshalFromString(`{}`, &obj))
  116. should.Equal("", obj.Field1)
  117. should.Nil(UnmarshalFromString(`{"Field1": "a", "Field2": "b", "Field3": "c"}`, &obj))
  118. should.Equal("a", obj.Field1)
  119. should.Equal("b", obj.Field2)
  120. should.Equal("c", obj.Field3)
  121. }
  122. func Test_decode_four_fields_struct(t *testing.T) {
  123. should := require.New(t)
  124. type TestObject struct {
  125. Field1 string
  126. Field2 string
  127. Field3 string
  128. Field4 string
  129. }
  130. obj := TestObject{}
  131. should.Nil(UnmarshalFromString(`{}`, &obj))
  132. should.Equal("", obj.Field1)
  133. should.Nil(UnmarshalFromString(`{"Field1": "a", "Field2": "b", "Field3": "c", "Field4": "d"}`, &obj))
  134. should.Equal("a", obj.Field1)
  135. should.Equal("b", obj.Field2)
  136. should.Equal("c", obj.Field3)
  137. should.Equal("d", obj.Field4)
  138. }
  139. func Test_decode_five_fields_struct(t *testing.T) {
  140. should := require.New(t)
  141. type TestObject struct {
  142. Field1 string
  143. Field2 string
  144. Field3 string
  145. Field4 string
  146. Field5 string
  147. }
  148. obj := TestObject{}
  149. should.Nil(UnmarshalFromString(`{}`, &obj))
  150. should.Equal("", obj.Field1)
  151. should.Nil(UnmarshalFromString(`{"Field1": "a", "Field2": "b", "Field3": "c", "Field4": "d", "Field5": "e"}`, &obj))
  152. should.Equal("a", obj.Field1)
  153. should.Equal("b", obj.Field2)
  154. should.Equal("c", obj.Field3)
  155. should.Equal("d", obj.Field4)
  156. should.Equal("e", obj.Field5)
  157. }
  158. func Test_decode_ten_fields_struct(t *testing.T) {
  159. should := require.New(t)
  160. type TestObject struct {
  161. Field1 string
  162. Field2 string
  163. Field3 string
  164. Field4 string
  165. Field5 string
  166. Field6 string
  167. Field7 string
  168. Field8 string
  169. Field9 string
  170. Field10 string
  171. }
  172. obj := TestObject{}
  173. should.Nil(UnmarshalFromString(`{}`, &obj))
  174. should.Equal("", obj.Field1)
  175. should.Nil(UnmarshalFromString(`{"Field1": "a", "Field2": "b", "Field3": "c", "Field4": "d", "Field5": "e"}`, &obj))
  176. should.Equal("a", obj.Field1)
  177. should.Equal("b", obj.Field2)
  178. should.Equal("c", obj.Field3)
  179. should.Equal("d", obj.Field4)
  180. should.Equal("e", obj.Field5)
  181. }
  182. func Test_decode_struct_field_with_tag(t *testing.T) {
  183. should := require.New(t)
  184. type TestObject struct {
  185. Field1 string `json:"field-1"`
  186. Field2 string `json:"-"`
  187. Field3 int `json:",string"`
  188. }
  189. obj := TestObject{Field2: "world"}
  190. UnmarshalFromString(`{"field-1": "hello", "field2": "", "Field3": "100"}`, &obj)
  191. should.Equal("hello", obj.Field1)
  192. should.Equal("world", obj.Field2)
  193. should.Equal(100, obj.Field3)
  194. }
  195. func Test_decode_struct_field_with_tag_string(t *testing.T) {
  196. should := require.New(t)
  197. type TestObject struct {
  198. Field1 int `json:",string"`
  199. }
  200. obj := TestObject{Field1: 100}
  201. should.Nil(UnmarshalFromString(`{"Field1": "100"}`, &obj))
  202. should.Equal(100, obj.Field1)
  203. }
  204. func Test_write_val_zero_field_struct(t *testing.T) {
  205. should := require.New(t)
  206. type TestObject struct {
  207. }
  208. obj := TestObject{}
  209. str, err := MarshalToString(obj)
  210. should.Nil(err)
  211. should.Equal(`{}`, str)
  212. }
  213. func Test_write_val_one_field_struct(t *testing.T) {
  214. should := require.New(t)
  215. type TestObject struct {
  216. Field1 string `json:"field-1"`
  217. }
  218. obj := TestObject{"hello"}
  219. str, err := MarshalToString(obj)
  220. should.Nil(err)
  221. should.Equal(`{"field-1":"hello"}`, str)
  222. }
  223. func Test_mixed(t *testing.T) {
  224. should := require.New(t)
  225. type AA struct {
  226. ID int `json:"id"`
  227. Payload map[string]interface{} `json:"payload"`
  228. buf *bytes.Buffer `json:"-"`
  229. }
  230. aa := AA{}
  231. err := UnmarshalFromString(` {"id":1, "payload":{"account":"123","password":"456"}}`, &aa)
  232. should.Nil(err)
  233. should.Equal(1, aa.ID)
  234. should.Equal("123", aa.Payload["account"])
  235. }
  236. func Test_omit_empty(t *testing.T) {
  237. should := require.New(t)
  238. type TestObject struct {
  239. Field1 string `json:"field-1,omitempty"`
  240. Field2 string `json:"field-2,omitempty"`
  241. Field3 string `json:"field-3,omitempty"`
  242. }
  243. obj := TestObject{}
  244. obj.Field2 = "hello"
  245. str, err := MarshalToString(&obj)
  246. should.Nil(err)
  247. should.Equal(`{"field-2":"hello"}`, str)
  248. }
  249. func Test_recursive_struct(t *testing.T) {
  250. should := require.New(t)
  251. type TestObject struct {
  252. Field1 string
  253. Me *TestObject
  254. }
  255. obj := TestObject{}
  256. str, err := MarshalToString(obj)
  257. should.Nil(err)
  258. should.Contains(str, `"Field1":""`)
  259. should.Contains(str, `"Me":null`)
  260. err = UnmarshalFromString(str, &obj)
  261. should.Nil(err)
  262. }
  263. func Test_encode_anonymous_struct(t *testing.T) {
  264. should := require.New(t)
  265. type TestObject struct {
  266. Field string
  267. }
  268. str, err := MarshalToString(struct {
  269. TestObject
  270. Field int
  271. }{
  272. Field: 100,
  273. })
  274. should.Nil(err)
  275. should.Equal(`{"Field":100}`, str)
  276. }
  277. func Test_decode_anonymous_struct(t *testing.T) {
  278. should := require.New(t)
  279. type Inner struct {
  280. Key string `json:"key"`
  281. }
  282. type Outer struct {
  283. Inner
  284. }
  285. var outer Outer
  286. j := []byte("{\"key\":\"value\"}")
  287. should.Nil(Unmarshal(j, &outer))
  288. should.Equal("value", outer.Key)
  289. }
  290. func Test_multiple_level_anonymous_struct(t *testing.T) {
  291. type Level1 struct {
  292. Field1 string
  293. }
  294. type Level2 struct {
  295. Level1
  296. Field2 string
  297. }
  298. type Level3 struct {
  299. Level2
  300. Field3 string
  301. }
  302. should := require.New(t)
  303. obj := Level3{Level2{Level1{"1"}, "2"}, "3"}
  304. output, err := MarshalToString(obj)
  305. should.Nil(err)
  306. should.Equal(`{"Field1":"1","Field2":"2","Field3":"3"}`, output)
  307. }
  308. func Test_multiple_level_anonymous_struct_with_ptr(t *testing.T) {
  309. type Level1 struct {
  310. Field1 string
  311. Field2 string
  312. Field4 string
  313. }
  314. type Level2 struct {
  315. *Level1
  316. Field2 string
  317. Field3 string
  318. }
  319. type Level3 struct {
  320. *Level2
  321. Field3 string
  322. }
  323. should := require.New(t)
  324. obj := Level3{&Level2{&Level1{"1", "", "4"}, "2", ""}, "3"}
  325. output, err := MarshalToString(obj)
  326. should.Nil(err)
  327. should.Contains(output, `"Field1":"1"`)
  328. should.Contains(output, `"Field2":"2"`)
  329. should.Contains(output, `"Field3":"3"`)
  330. should.Contains(output, `"Field4":"4"`)
  331. }
  332. func Test_shadow_struct_field(t *testing.T) {
  333. should := require.New(t)
  334. type omit *struct{}
  335. type CacheItem struct {
  336. Key string `json:"key"`
  337. MaxAge int `json:"cacheAge"`
  338. }
  339. output, err := MarshalToString(struct {
  340. *CacheItem
  341. // Omit bad keys
  342. OmitMaxAge omit `json:"cacheAge,omitempty"`
  343. // Add nice keys
  344. MaxAge int `json:"max_age"`
  345. }{
  346. CacheItem: &CacheItem{
  347. Key: "value",
  348. MaxAge: 100,
  349. },
  350. MaxAge: 20,
  351. })
  352. should.Nil(err)
  353. should.Contains(output, `"key":"value"`)
  354. should.Contains(output, `"max_age":20`)
  355. }
  356. func Test_embeded_order(t *testing.T) {
  357. type A struct {
  358. Field2 string
  359. }
  360. type C struct {
  361. Field5 string
  362. }
  363. type B struct {
  364. Field4 string
  365. C
  366. Field6 string
  367. }
  368. type TestObject struct {
  369. Field1 string
  370. A
  371. Field3 string
  372. B
  373. Field7 string
  374. }
  375. should := require.New(t)
  376. s := TestObject{}
  377. output, err := MarshalToString(s)
  378. should.Nil(err)
  379. should.Equal(`{"Field1":"","Field2":"","Field3":"","Field4":"","Field5":"","Field6":"","Field7":""}`, output)
  380. }
  381. func Test_decode_nested(t *testing.T) {
  382. type StructOfString struct {
  383. Field1 string
  384. Field2 string
  385. }
  386. iter := ParseString(ConfigDefault, `[{"field1": "hello"}, null, {"field2": "world"}]`)
  387. slice := []*StructOfString{}
  388. iter.ReadVal(&slice)
  389. if len(slice) != 3 {
  390. fmt.Println(iter.Error)
  391. t.Fatal(len(slice))
  392. }
  393. if slice[0].Field1 != "hello" {
  394. fmt.Println(iter.Error)
  395. t.Fatal(slice[0])
  396. }
  397. if slice[1] != nil {
  398. fmt.Println(iter.Error)
  399. t.Fatal(slice[1])
  400. }
  401. if slice[2].Field2 != "world" {
  402. fmt.Println(iter.Error)
  403. t.Fatal(slice[2])
  404. }
  405. }