You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

serder_test.go 1.9 kB

2 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package serder
  2. import (
  3. "testing"
  4. "time"
  5. . "github.com/smartystreets/goconvey/convey"
  6. myreflect "gitlink.org.cn/cloudream/common/utils/reflect"
  7. )
  8. func Test_MapToObject(t *testing.T) {
  9. Convey("包含用字符串保存的int数据", t, func() {
  10. type Struct struct {
  11. A string `json:"a"`
  12. B int `json:"b"`
  13. C int64 `json:"c,string"`
  14. }
  15. mp := map[string]any{
  16. "a": "a",
  17. "b": 1,
  18. "c": "1234",
  19. }
  20. var st Struct
  21. err := MapToObject(mp, &st)
  22. So(err, ShouldBeNil)
  23. So(st.A, ShouldEqual, "a")
  24. So(st.B, ShouldEqual, 1)
  25. So(st.C, ShouldEqual, 1234)
  26. })
  27. Convey("包含Time,先从结构体转为JSON,再从JSON转为Map,最后变回结构体", t, func() {
  28. type Struct struct {
  29. Time time.Time
  30. NilTime *time.Time
  31. }
  32. var st = Struct{
  33. Time: time.Now(),
  34. NilTime: nil,
  35. }
  36. data, err := ObjectToJSON(st)
  37. So(err, ShouldBeNil)
  38. var mp map[string]any
  39. err = JSONToObject(data, &mp)
  40. So(err, ShouldBeNil)
  41. var st2 Struct
  42. err = MapToObject(mp, &st2)
  43. So(err, ShouldBeNil)
  44. So(st.Time, ShouldEqual, st2.Time)
  45. So(st.NilTime, ShouldEqual, st2.NilTime)
  46. })
  47. }
  48. func Test_TypedMapToObject(t *testing.T) {
  49. type Struct struct {
  50. A string `json:"a"`
  51. B int `json:"b"`
  52. C int64 `json:"c,string"`
  53. }
  54. nameResovler := NewTypeNameResolver(true)
  55. nameResovler.Register(myreflect.TypeOf[Struct]())
  56. Convey("结构体", t, func() {
  57. st := Struct{
  58. A: "a",
  59. B: 1,
  60. C: 2,
  61. }
  62. mp, err := ObjectToTypedMap(st, TypedSerderOption{
  63. TypeResolver: &nameResovler,
  64. TypeFieldName: "@type",
  65. })
  66. So(err, ShouldBeNil)
  67. st2Ptr, err := TypedMapToObject(mp, TypedSerderOption{
  68. TypeResolver: &nameResovler,
  69. TypeFieldName: "@type",
  70. })
  71. So(err, ShouldBeNil)
  72. st2, ok := st2Ptr.(Struct)
  73. So(ok, ShouldBeTrue)
  74. So(st2, ShouldHaveSameTypeAs, st)
  75. So(st2, ShouldResemble, st)
  76. })
  77. }

公共库

Contributors (1)