|
- package serder
-
- import (
- "testing"
- "time"
-
- . "github.com/smartystreets/goconvey/convey"
- myreflect "gitlink.org.cn/cloudream/common/utils/reflect"
- )
-
- func Test_MapToObject(t *testing.T) {
- Convey("包含用字符串保存的int数据", t, func() {
- type Struct struct {
- A string `json:"a"`
- B int `json:"b"`
- C int64 `json:"c,string"`
- }
-
- mp := map[string]any{
- "a": "a",
- "b": 1,
- "c": "1234",
- }
-
- var st Struct
-
- err := MapToObject(mp, &st)
- So(err, ShouldBeNil)
-
- So(st.A, ShouldEqual, "a")
- So(st.B, ShouldEqual, 1)
- So(st.C, ShouldEqual, 1234)
- })
-
- Convey("包含Time,先从结构体转为JSON,再从JSON转为Map,最后变回结构体", t, func() {
- type Struct struct {
- Time time.Time
- NilTime *time.Time
- }
-
- var st = Struct{
- Time: time.Now(),
- NilTime: nil,
- }
-
- data, err := ObjectToJSON(st)
- So(err, ShouldBeNil)
-
- var mp map[string]any
- err = JSONToObject(data, &mp)
- So(err, ShouldBeNil)
-
- var st2 Struct
- err = MapToObject(mp, &st2)
- So(err, ShouldBeNil)
-
- So(st.Time, ShouldEqual, st2.Time)
- So(st.NilTime, ShouldEqual, st2.NilTime)
- })
- }
-
- func Test_TypedMapToObject(t *testing.T) {
- type Struct struct {
- A string `json:"a"`
- B int `json:"b"`
- C int64 `json:"c,string"`
- }
-
- nameResovler := NewTypeNameResolver(true)
- nameResovler.Register(myreflect.TypeOf[Struct]())
-
- Convey("结构体", t, func() {
- st := Struct{
- A: "a",
- B: 1,
- C: 2,
- }
-
- mp, err := ObjectToTypedMap(st, TypedSerderOption{
- TypeResolver: &nameResovler,
- TypeFieldName: "@type",
- })
-
- So(err, ShouldBeNil)
-
- st2Ptr, err := TypedMapToObject(mp, TypedSerderOption{
- TypeResolver: &nameResovler,
- TypeFieldName: "@type",
- })
- So(err, ShouldBeNil)
-
- st2, ok := st2Ptr.(Struct)
- So(ok, ShouldBeTrue)
- So(st2, ShouldHaveSameTypeAs, st)
- So(st2, ShouldResemble, st)
- })
-
- }
|