jsoniter_object_test.go 14 KB

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