jsoniter_object_test.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  1. package jsoniter
  2. import (
  3. "bytes"
  4. "fmt"
  5. "testing"
  6. "github.com/stretchr/testify/require"
  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": "stream"}`)
  22. field := iter.ReadObject()
  23. should.Equal("a", field)
  24. value := iter.ReadString()
  25. should.Equal("stream", value)
  26. field = iter.ReadObject()
  27. should.Equal("", field)
  28. iter = ParseString(ConfigDefault, `{"a": "stream"}`)
  29. should.True(iter.ReadObjectCB(func(iter *Iterator, field string) bool {
  30. should.Equal("a", field)
  31. iter.Skip()
  32. return true
  33. }))
  34. }
  35. func Test_two_field(t *testing.T) {
  36. should := require.New(t)
  37. iter := ParseString(ConfigDefault, `{ "a": "stream" , "c": "d" }`)
  38. field := iter.ReadObject()
  39. should.Equal("a", field)
  40. value := iter.ReadString()
  41. should.Equal("stream", value)
  42. field = iter.ReadObject()
  43. should.Equal("c", field)
  44. value = iter.ReadString()
  45. should.Equal("d", value)
  46. field = iter.ReadObject()
  47. should.Equal("", field)
  48. iter = ParseString(ConfigDefault, `{"field1": "1", "field2": 2}`)
  49. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  50. switch field {
  51. case "field1":
  52. iter.ReadString()
  53. case "field2":
  54. iter.ReadInt64()
  55. default:
  56. iter.ReportError("bind object", "unexpected field")
  57. }
  58. }
  59. }
  60. func Test_object_wrapper_any_get_all(t *testing.T) {
  61. should := require.New(t)
  62. type TestObject struct {
  63. Field1 []int
  64. Field2 []int
  65. }
  66. any := Wrap(TestObject{[]int{1, 2}, []int{3, 4}})
  67. should.Contains(any.Get('*', 0).ToString(), `"Field2":3`)
  68. should.Contains(any.Keys(), "Field1")
  69. should.Contains(any.Keys(), "Field2")
  70. should.NotContains(any.Keys(), "Field3")
  71. //should.Contains(any.GetObject()["Field1"].GetArray()[0], 1)
  72. }
  73. func Test_write_object(t *testing.T) {
  74. should := require.New(t)
  75. buf := &bytes.Buffer{}
  76. stream := NewStream(Config{IndentionStep: 2}.Froze(), buf, 4096)
  77. stream.WriteObjectStart()
  78. stream.WriteObjectField("hello")
  79. stream.WriteInt(1)
  80. stream.WriteMore()
  81. stream.WriteObjectField("world")
  82. stream.WriteInt(2)
  83. stream.WriteObjectEnd()
  84. stream.Flush()
  85. should.Nil(stream.Error)
  86. should.Equal("{\n \"hello\": 1,\n \"world\": 2\n}", buf.String())
  87. }
  88. func Test_decode_one_field_struct(t *testing.T) {
  89. should := require.New(t)
  90. type TestObject struct {
  91. Field1 string
  92. }
  93. obj := TestObject{}
  94. should.Nil(UnmarshalFromString(`{}`, &obj))
  95. should.Equal("", obj.Field1)
  96. should.Nil(UnmarshalFromString(`{"field1": "hello"}`, &obj))
  97. should.Equal("hello", obj.Field1)
  98. }
  99. func Test_decode_two_fields_struct(t *testing.T) {
  100. should := require.New(t)
  101. type TestObject struct {
  102. Field1 string
  103. Field2 string
  104. }
  105. obj := TestObject{}
  106. should.Nil(UnmarshalFromString(`{}`, &obj))
  107. should.Equal("", obj.Field1)
  108. should.Nil(UnmarshalFromString(`{"Field1": "a", "Field2": "stream"}`, &obj))
  109. should.Equal("a", obj.Field1)
  110. should.Equal("stream", obj.Field2)
  111. }
  112. func Test_decode_three_fields_struct(t *testing.T) {
  113. should := require.New(t)
  114. type TestObject struct {
  115. Field1 string
  116. Field2 string
  117. Field3 string
  118. }
  119. obj := TestObject{}
  120. should.Nil(UnmarshalFromString(`{}`, &obj))
  121. should.Equal("", obj.Field1)
  122. should.Nil(UnmarshalFromString(`{"Field1": "a", "Field2": "stream", "Field3": "c"}`, &obj))
  123. should.Equal("a", obj.Field1)
  124. should.Equal("stream", obj.Field2)
  125. should.Equal("c", obj.Field3)
  126. }
  127. func Test_decode_four_fields_struct(t *testing.T) {
  128. should := require.New(t)
  129. type TestObject struct {
  130. Field1 string
  131. Field2 string
  132. Field3 string
  133. Field4 string
  134. }
  135. obj := TestObject{}
  136. should.Nil(UnmarshalFromString(`{}`, &obj))
  137. should.Equal("", obj.Field1)
  138. should.Nil(UnmarshalFromString(`{"Field1": "a", "Field2": "stream", "Field3": "c", "Field4": "d"}`, &obj))
  139. should.Equal("a", obj.Field1)
  140. should.Equal("stream", obj.Field2)
  141. should.Equal("c", obj.Field3)
  142. should.Equal("d", obj.Field4)
  143. }
  144. func Test_decode_five_fields_struct(t *testing.T) {
  145. should := require.New(t)
  146. type TestObject struct {
  147. Field1 string
  148. Field2 string
  149. Field3 string
  150. Field4 string
  151. Field5 string
  152. }
  153. obj := TestObject{}
  154. should.Nil(UnmarshalFromString(`{}`, &obj))
  155. should.Equal("", obj.Field1)
  156. should.Nil(UnmarshalFromString(`{"Field1": "a", "Field2": "stream", "Field3": "c", "Field4": "d", "Field5": "e"}`, &obj))
  157. should.Equal("a", obj.Field1)
  158. should.Equal("stream", obj.Field2)
  159. should.Equal("c", obj.Field3)
  160. should.Equal("d", obj.Field4)
  161. should.Equal("e", obj.Field5)
  162. }
  163. func Test_decode_six_fields_struct(t *testing.T) {
  164. should := require.New(t)
  165. type TestObject struct {
  166. Field1 string
  167. Field2 string
  168. Field3 string
  169. Field4 string
  170. Field5 string
  171. Field6 string
  172. }
  173. obj := TestObject{}
  174. should.Nil(UnmarshalFromString(`{}`, &obj))
  175. should.Equal("", obj.Field1)
  176. should.Nil(UnmarshalFromString(`{"Field1": "a", "Field2": "stream", "Field3": "c", "Field4": "d", "Field5": "e", "Field6": "x"}`, &obj))
  177. should.Equal("a", obj.Field1)
  178. should.Equal("stream", obj.Field2)
  179. should.Equal("c", obj.Field3)
  180. should.Equal("d", obj.Field4)
  181. should.Equal("e", obj.Field5)
  182. should.Equal("x", obj.Field6)
  183. }
  184. func Test_decode_seven_fields_struct(t *testing.T) {
  185. should := require.New(t)
  186. type TestObject struct {
  187. Field1 string
  188. Field2 string
  189. Field3 string
  190. Field4 string
  191. Field5 string
  192. Field6 string
  193. Field7 string
  194. }
  195. obj := TestObject{}
  196. should.Nil(UnmarshalFromString(`{}`, &obj))
  197. should.Equal("", obj.Field1)
  198. should.Nil(UnmarshalFromString(`{"Field1": "a", "Field2": "stream", "Field3": "c", "Field4": "d", "Field5": "e", "Field6": "x", "Field7":"y"}`, &obj))
  199. should.Equal("a", obj.Field1)
  200. should.Equal("stream", obj.Field2)
  201. should.Equal("c", obj.Field3)
  202. should.Equal("d", obj.Field4)
  203. should.Equal("e", obj.Field5)
  204. should.Equal("x", obj.Field6)
  205. should.Equal("y", obj.Field7)
  206. }
  207. func Test_decode_eight_fields_struct(t *testing.T) {
  208. should := require.New(t)
  209. type TestObject struct {
  210. Field1 string
  211. Field2 string
  212. Field3 string
  213. Field4 string
  214. Field5 string
  215. Field6 string
  216. Field7 string
  217. Field8 string
  218. }
  219. obj := TestObject{}
  220. should.Nil(UnmarshalFromString(`{}`, &obj))
  221. should.Equal("", obj.Field1)
  222. should.Nil(UnmarshalFromString(`{"Field8":"1", "Field1": "a", "Field2": "stream", "Field3": "c", "Field4": "d", "Field5": "e", "Field6": "x", "Field7":"y"}`, &obj))
  223. should.Equal("a", obj.Field1)
  224. should.Equal("stream", obj.Field2)
  225. should.Equal("c", obj.Field3)
  226. should.Equal("d", obj.Field4)
  227. should.Equal("e", obj.Field5)
  228. should.Equal("x", obj.Field6)
  229. should.Equal("y", obj.Field7)
  230. should.Equal("1", obj.Field8)
  231. }
  232. func Test_decode_nine_fields_struct(t *testing.T) {
  233. should := require.New(t)
  234. type TestObject struct {
  235. Field1 string
  236. Field2 string
  237. Field3 string
  238. Field4 string
  239. Field5 string
  240. Field6 string
  241. Field7 string
  242. Field8 string
  243. Field9 string
  244. }
  245. obj := TestObject{}
  246. should.Nil(UnmarshalFromString(`{}`, &obj))
  247. should.Equal("", obj.Field1)
  248. should.Nil(UnmarshalFromString(`{"Field8" : "zzzzzzzzzzz", "Field7": "zz", "Field6" : "xx", "Field1": "a", "Field2": "stream", "Field3": "c", "Field4": "d", "Field5": "e", "Field9":"f"}`, &obj))
  249. should.Equal("a", obj.Field1)
  250. should.Equal("stream", obj.Field2)
  251. should.Equal("c", obj.Field3)
  252. should.Equal("d", obj.Field4)
  253. should.Equal("e", obj.Field5)
  254. should.Equal("xx", obj.Field6)
  255. should.Equal("zz", obj.Field7)
  256. should.Equal("zzzzzzzzzzz", obj.Field8)
  257. should.Equal("f", obj.Field9)
  258. }
  259. func Test_decode_ten_fields_struct(t *testing.T) {
  260. should := require.New(t)
  261. type TestObject struct {
  262. Field1 string
  263. Field2 string
  264. Field3 string
  265. Field4 string
  266. Field5 string
  267. Field6 string
  268. Field7 string
  269. Field8 string
  270. Field9 string
  271. Field10 string
  272. }
  273. obj := TestObject{}
  274. should.Nil(UnmarshalFromString(`{}`, &obj))
  275. should.Equal("", obj.Field1)
  276. should.Nil(UnmarshalFromString(`{"Field10":"x", "Field9": "x", "Field8":"x", "Field7":"x", "Field6":"x", "Field1": "a", "Field2": "stream", "Field3": "c", "Field4": "d", "Field5": "e"}`, &obj))
  277. should.Equal("a", obj.Field1)
  278. should.Equal("stream", obj.Field2)
  279. should.Equal("c", obj.Field3)
  280. should.Equal("d", obj.Field4)
  281. should.Equal("e", obj.Field5)
  282. should.Equal("x", obj.Field6)
  283. should.Equal("x", obj.Field7)
  284. should.Equal("x", obj.Field8)
  285. should.Equal("x", obj.Field9)
  286. should.Equal("x", obj.Field10)
  287. }
  288. func Test_decode_more_than_ten_fields_struct(t *testing.T) {
  289. should := require.New(t)
  290. type TestObject struct {
  291. Field1 string
  292. Field2 string
  293. Field3 string
  294. Field4 string
  295. Field5 string
  296. Field6 string
  297. Field7 string
  298. Field8 string
  299. Field9 string
  300. Field10 string
  301. Field11 int
  302. }
  303. obj := TestObject{}
  304. should.Nil(UnmarshalFromString(`{}`, &obj))
  305. should.Equal("", obj.Field1)
  306. should.Nil(UnmarshalFromString(`{"Field11":1, "Field1": "a", "Field2": "stream", "Field3": "c", "Field4": "d", "Field5": "e"}`, &obj))
  307. should.Equal("a", obj.Field1)
  308. should.Equal("stream", obj.Field2)
  309. should.Equal("c", obj.Field3)
  310. should.Equal("d", obj.Field4)
  311. should.Equal("e", obj.Field5)
  312. should.Equal(1, obj.Field11)
  313. }
  314. func Test_decode_struct_field_with_tag(t *testing.T) {
  315. should := require.New(t)
  316. type TestObject struct {
  317. Field1 string `json:"field-1"`
  318. Field2 string `json:"-"`
  319. Field3 int `json:",string"`
  320. }
  321. obj := TestObject{Field2: "world"}
  322. UnmarshalFromString(`{"field-1": "hello", "field2": "", "Field3": "100"}`, &obj)
  323. should.Equal("hello", obj.Field1)
  324. should.Equal("world", obj.Field2)
  325. should.Equal(100, obj.Field3)
  326. }
  327. func Test_decode_struct_field_with_tag_string(t *testing.T) {
  328. should := require.New(t)
  329. type TestObject struct {
  330. Field1 int `json:",string"`
  331. }
  332. obj := TestObject{Field1: 100}
  333. should.Nil(UnmarshalFromString(`{"Field1": "100"}`, &obj))
  334. should.Equal(100, obj.Field1)
  335. }
  336. func Test_write_val_zero_field_struct(t *testing.T) {
  337. should := require.New(t)
  338. type TestObject struct {
  339. }
  340. obj := TestObject{}
  341. str, err := MarshalToString(obj)
  342. should.Nil(err)
  343. should.Equal(`{}`, str)
  344. }
  345. func Test_write_val_one_field_struct(t *testing.T) {
  346. should := require.New(t)
  347. type TestObject struct {
  348. Field1 string `json:"field-1"`
  349. }
  350. obj := TestObject{"hello"}
  351. str, err := MarshalToString(obj)
  352. should.Nil(err)
  353. should.Equal(`{"field-1":"hello"}`, str)
  354. }
  355. func Test_mixed(t *testing.T) {
  356. should := require.New(t)
  357. type AA struct {
  358. ID int `json:"id"`
  359. Payload map[string]interface{} `json:"payload"`
  360. buf *bytes.Buffer
  361. }
  362. aa := AA{}
  363. err := UnmarshalFromString(` {"id":1, "payload":{"account":"123","password":"456"}}`, &aa)
  364. should.Nil(err)
  365. should.Equal(1, aa.ID)
  366. should.Equal("123", aa.Payload["account"])
  367. }
  368. func Test_omit_empty(t *testing.T) {
  369. should := require.New(t)
  370. type TestObject struct {
  371. Field1 string `json:"field-1,omitempty"`
  372. Field2 string `json:"field-2,omitempty"`
  373. Field3 string `json:"field-3,omitempty"`
  374. }
  375. obj := TestObject{}
  376. obj.Field2 = "hello"
  377. str, err := MarshalToString(&obj)
  378. should.Nil(err)
  379. should.Equal(`{"field-2":"hello"}`, str)
  380. }
  381. func Test_ignore_field_on_not_valid_type(t *testing.T) {
  382. should := require.New(t)
  383. type TestObject struct {
  384. Field1 string `json:"field-1,omitempty"`
  385. Field2 func() `json:"-"`
  386. }
  387. obj := TestObject{}
  388. obj.Field1 = "hello world"
  389. obj.Field2 = func() {}
  390. str, err := MarshalToString(&obj)
  391. should.Nil(err)
  392. should.Equal(`{"field-1":"hello world"}`, str)
  393. }
  394. func Test_recursive_struct(t *testing.T) {
  395. should := require.New(t)
  396. type TestObject struct {
  397. Field1 string
  398. Me *TestObject
  399. }
  400. obj := TestObject{}
  401. str, err := MarshalToString(obj)
  402. should.Nil(err)
  403. should.Contains(str, `"Field1":""`)
  404. should.Contains(str, `"Me":null`)
  405. err = UnmarshalFromString(str, &obj)
  406. should.Nil(err)
  407. }
  408. func Test_encode_anonymous_struct(t *testing.T) {
  409. should := require.New(t)
  410. type TestObject struct {
  411. Field string
  412. }
  413. str, err := MarshalToString(struct {
  414. TestObject
  415. Field int
  416. }{
  417. Field: 100,
  418. })
  419. should.Nil(err)
  420. should.Equal(`{"Field":100}`, str)
  421. }
  422. func Test_decode_anonymous_struct(t *testing.T) {
  423. should := require.New(t)
  424. type Inner struct {
  425. Key string `json:"key"`
  426. }
  427. type Outer struct {
  428. Inner
  429. }
  430. var outer Outer
  431. j := []byte("{\"key\":\"value\"}")
  432. should.Nil(Unmarshal(j, &outer))
  433. should.Equal("value", outer.Key)
  434. }
  435. func Test_multiple_level_anonymous_struct(t *testing.T) {
  436. type Level1 struct {
  437. Field1 string
  438. }
  439. type Level2 struct {
  440. Level1
  441. Field2 string
  442. }
  443. type Level3 struct {
  444. Level2
  445. Field3 string
  446. }
  447. should := require.New(t)
  448. obj := Level3{Level2{Level1{"1"}, "2"}, "3"}
  449. output, err := MarshalToString(obj)
  450. should.Nil(err)
  451. should.Equal(`{"Field1":"1","Field2":"2","Field3":"3"}`, output)
  452. }
  453. func Test_multiple_level_anonymous_struct_with_ptr(t *testing.T) {
  454. type Level1 struct {
  455. Field1 string
  456. Field2 string
  457. Field4 string
  458. }
  459. type Level2 struct {
  460. *Level1
  461. Field2 string
  462. Field3 string
  463. }
  464. type Level3 struct {
  465. *Level2
  466. Field3 string
  467. }
  468. should := require.New(t)
  469. obj := Level3{&Level2{&Level1{"1", "", "4"}, "2", ""}, "3"}
  470. output, err := MarshalToString(obj)
  471. should.Nil(err)
  472. should.Contains(output, `"Field1":"1"`)
  473. should.Contains(output, `"Field2":"2"`)
  474. should.Contains(output, `"Field3":"3"`)
  475. should.Contains(output, `"Field4":"4"`)
  476. }
  477. func Test_shadow_struct_field(t *testing.T) {
  478. should := require.New(t)
  479. type omit *struct{}
  480. type CacheItem struct {
  481. Key string `json:"key"`
  482. MaxAge int `json:"cacheAge"`
  483. }
  484. output, err := MarshalToString(struct {
  485. *CacheItem
  486. // Omit bad keys
  487. OmitMaxAge omit `json:"cacheAge,omitempty"`
  488. // Add nice keys
  489. MaxAge int `json:"max_age"`
  490. }{
  491. CacheItem: &CacheItem{
  492. Key: "value",
  493. MaxAge: 100,
  494. },
  495. MaxAge: 20,
  496. })
  497. should.Nil(err)
  498. should.Contains(output, `"key":"value"`)
  499. should.Contains(output, `"max_age":20`)
  500. }
  501. func Test_embedded_order(t *testing.T) {
  502. type A struct {
  503. Field2 string
  504. }
  505. type C struct {
  506. Field5 string
  507. }
  508. type B struct {
  509. Field4 string
  510. C
  511. Field6 string
  512. }
  513. type TestObject struct {
  514. Field1 string
  515. A
  516. Field3 string
  517. B
  518. Field7 string
  519. }
  520. should := require.New(t)
  521. s := TestObject{}
  522. output, err := MarshalToString(s)
  523. should.Nil(err)
  524. should.Equal(`{"Field1":"","Field2":"","Field3":"","Field4":"","Field5":"","Field6":"","Field7":""}`, output)
  525. }
  526. func Test_decode_nested(t *testing.T) {
  527. type StructOfString struct {
  528. Field1 string
  529. Field2 string
  530. }
  531. iter := ParseString(ConfigDefault, `[{"field1": "hello"}, null, {"field2": "world"}]`)
  532. slice := []*StructOfString{}
  533. iter.ReadVal(&slice)
  534. if len(slice) != 3 {
  535. fmt.Println(iter.Error)
  536. t.Fatal(len(slice))
  537. }
  538. if slice[0].Field1 != "hello" {
  539. fmt.Println(iter.Error)
  540. t.Fatal(slice[0])
  541. }
  542. if slice[1] != nil {
  543. fmt.Println(iter.Error)
  544. t.Fatal(slice[1])
  545. }
  546. if slice[2].Field2 != "world" {
  547. fmt.Println(iter.Error)
  548. t.Fatal(slice[2])
  549. }
  550. }