feat(Go-StudyExample):
2021/01/27:新增mapstructure源码阅读和单测代码
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
* @Author : huangzj
|
||||
* @Time : 2021/1/25 16:09
|
||||
* @Description:
|
||||
*/
|
||||
|
||||
package example
|
||||
|
||||
import (
|
||||
"github.com/mitchellh/mapstructure"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestDefaultHook(t *testing.T) {
|
||||
//在 mitchellh/mapstructure 这个工程中提供了部分的默认Hook方法,主要作用是进行转换,具体可以查看源码
|
||||
mapstructure.StringToIPNetHookFunc()
|
||||
}
|
||||
@@ -0,0 +1,132 @@
|
||||
package example
|
||||
|
||||
import (
|
||||
entity2 "Go-StudyExample/entity"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/goinggo/mapstructure"
|
||||
"testing"
|
||||
)
|
||||
|
||||
//-----------------------json数据---------------------
|
||||
var document = `{"loginName":"sptest1","userType":{"userTypeId":1,"userTypeName":"normal_user","t":"2026-01-02 15:04:05"}}`
|
||||
|
||||
var document1 = `{"cobrandId":10010352,"channelId":-1,"locale":"en_US","tncVersion":2,"people":[{"name":"jack","age":{"birth":10,"year":2000,"animals":[{"barks":"yes","tail":"yes"},{"barks":"no","tail":"yes"}]}},{"name":"jill","age":{"birth":11,"year":2001}}]}`
|
||||
|
||||
var document2 = `[{"name":"bill"},{"name":"lisa"}]`
|
||||
|
||||
var document3 = `{"categories":["12","222","333"],"people":{"name":"jack","age":{"birth":10,"year":2000,"animals":[{"barks":"yes","tail":"yes"},{"barks":"no","tail":"yes"}]}}}`
|
||||
|
||||
//-----------------------------结构体-----------------------
|
||||
type Animal struct {
|
||||
Barks string `jpath:"barks"`
|
||||
}
|
||||
|
||||
type People struct {
|
||||
Age int `jpath:"age.birth"` // jpath is relative to the array
|
||||
Animals []Animal `jpath:"age.animals"`
|
||||
}
|
||||
|
||||
type Items struct {
|
||||
Categories []string `jpath:"categories"`
|
||||
Peoples []People `jpath:"people"` // Specify the location of the array
|
||||
}
|
||||
|
||||
type Items1 struct {
|
||||
Categories []string `mapstructure:"Categories"`
|
||||
Peoples People1 `mapstructure:"People"` // Specify the location of the array
|
||||
}
|
||||
|
||||
type People1 struct {
|
||||
Age int `mapstructure:"age.birth"` // jpath is relative to the array
|
||||
Animals []Animal `mapstructure:"age.animals"`
|
||||
}
|
||||
|
||||
type NameDoc struct {
|
||||
Name string `jpath:"name"`
|
||||
}
|
||||
|
||||
//---------------------------------测试方法------------------------
|
||||
|
||||
//基本测试
|
||||
func TestMapStructureTestFunc(t *testing.T) {
|
||||
var te entity2.Entity
|
||||
m := make(map[string]interface{})
|
||||
m["Num"] = 1
|
||||
m["S"] = "test"
|
||||
m["T"] = map[string]string{"1": "1", "2": "2"}
|
||||
|
||||
err := mapstructure.Decode(m, &te)
|
||||
if err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
|
||||
fmt.Print(te.Num, " ", te.S, " ", te.T)
|
||||
}
|
||||
|
||||
//基本测试
|
||||
func TestMapStructureTestFunc1(t *testing.T) {
|
||||
var docMap map[string]interface{}
|
||||
_ = json.Unmarshal([]byte(document), &docMap)
|
||||
|
||||
var user entity2.User
|
||||
err := mapstructure.Decode(docMap, &user)
|
||||
|
||||
if err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
fmt.Println(user.T.Format("2006-01-02 15:04:05"))
|
||||
fmt.Println(user, " ", user.UserType.UserTypeId, " ", user.UserType.UserTypeName)
|
||||
}
|
||||
|
||||
//测试切片转换
|
||||
func TestMapStructureTestFunc2(t *testing.T) {
|
||||
|
||||
sliceScript := []byte(document2)
|
||||
var sliceMap []map[string]interface{}
|
||||
_ = json.Unmarshal(sliceScript, &sliceMap)
|
||||
|
||||
var myslice []NameDoc
|
||||
err := mapstructure.DecodeSlicePath(sliceMap, &myslice)
|
||||
|
||||
if err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
|
||||
fmt.Println(myslice[0], " ", myslice[1])
|
||||
}
|
||||
|
||||
//测试DecodePath
|
||||
func TestMapStructureTestFunc3(t *testing.T) {
|
||||
docScript := []byte(document1)
|
||||
var docMap map[string]interface{}
|
||||
_ = json.Unmarshal(docScript, &docMap)
|
||||
|
||||
var items Items
|
||||
err := mapstructure.DecodePath(docMap, &items)
|
||||
if err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
fmt.Println(items.Peoples[0], items.Peoples[1])
|
||||
}
|
||||
|
||||
//MetaData的测试例子
|
||||
//decode不支持 mapstructure的标识是 xxxx.xxxx
|
||||
//并且这边是对tag别名不区分大小写的
|
||||
func TestMetaData(t *testing.T) {
|
||||
var items1 Items1
|
||||
config := &mapstructure.DecoderConfig{
|
||||
Metadata: &mapstructure.Metadata{
|
||||
Keys: nil,
|
||||
Unused: nil,
|
||||
},
|
||||
Result: &items1,
|
||||
}
|
||||
decoder, _ := mapstructure.NewDecoder(config)
|
||||
docScript := []byte(document3)
|
||||
var docMap map[string]interface{}
|
||||
_ = json.Unmarshal(docScript, &docMap)
|
||||
|
||||
_ = decoder.Decode(docMap)
|
||||
fmt.Println(config.Metadata)
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
## 官方包获取方式
|
||||
|
||||
go get github.com/goinggo/mapstructure
|
||||
|
||||
## 官方提供默认Hook
|
||||
获取方式:
|
||||
|
||||
go get github.com/mitchellh/mapstructure
|
||||
|
||||
|
||||
Reference in New Issue
Block a user