- Unmarshal2Map
This commit is contained in:
@@ -13,6 +13,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi"
|
"git.rosy.net.cn/baseapi"
|
||||||
|
"github.com/fatih/structs"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -40,6 +41,23 @@ func UnmarshalUseNumber(data []byte, result interface{}) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 这个函数将解析json,返回的map中的字段类型与structObj中的完全一样的
|
||||||
|
func Unmarshal2Map(data []byte, structObj interface{}) (resultMap map[string]interface{}, err error) {
|
||||||
|
if err = json.Unmarshal(data, structObj); err == nil {
|
||||||
|
if err = json.Unmarshal(data, &resultMap); err == nil {
|
||||||
|
m := structs.Map(structObj)
|
||||||
|
for k := range resultMap {
|
||||||
|
if value, ok := m[k]; ok {
|
||||||
|
resultMap[k] = value
|
||||||
|
} else {
|
||||||
|
delete(resultMap, k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return resultMap, err
|
||||||
|
}
|
||||||
|
|
||||||
func MustMarshal(obj interface{}) []byte {
|
func MustMarshal(obj interface{}) []byte {
|
||||||
byteArr, err := json.Marshal(obj)
|
byteArr, err := json.Marshal(obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -45,6 +45,46 @@ type TestModel2 struct {
|
|||||||
AddData string
|
AddData string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUnmarshal2Map(t *testing.T) {
|
||||||
|
jsonStr := `
|
||||||
|
{
|
||||||
|
"IntData" : 1,
|
||||||
|
"Int64Data" : 2,
|
||||||
|
"NotField" : "hello",
|
||||||
|
"StrData" : "world"
|
||||||
|
}
|
||||||
|
`
|
||||||
|
var kk TestModel
|
||||||
|
result, err := Unmarshal2Map([]byte(jsonStr), &kk)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("Unmarshal2Map error")
|
||||||
|
}
|
||||||
|
// t.Log(result)
|
||||||
|
if _, ok := result["NotField"]; ok {
|
||||||
|
t.Fatal("NotField should not exist")
|
||||||
|
}
|
||||||
|
if result["IntData"] != 1 {
|
||||||
|
t.Fatal("IntData should equal to 1")
|
||||||
|
}
|
||||||
|
if result["Int64Data"] != int64(2) {
|
||||||
|
t.Fatal("Int64Data should equal to int64 2")
|
||||||
|
}
|
||||||
|
if result["StrData"] != "world" {
|
||||||
|
t.Fatal("StrData should equal to world")
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonStr = ""
|
||||||
|
result, err = Unmarshal2Map([]byte(jsonStr), &kk)
|
||||||
|
if err == nil {
|
||||||
|
t.Fatal("Unmarshal2Map should error")
|
||||||
|
}
|
||||||
|
jsonStr = "{}"
|
||||||
|
result, err = Unmarshal2Map([]byte(jsonStr), &kk)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("Unmarshal2Map error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func unmarshStr(t *testing.T, jsonStr string, obj interface{}) {
|
func unmarshStr(t *testing.T, jsonStr string, obj interface{}) {
|
||||||
|
|
||||||
err := UnmarshalUseNumber([]byte(jsonStr), obj)
|
err := UnmarshalUseNumber([]byte(jsonStr), obj)
|
||||||
|
|||||||
Reference in New Issue
Block a user