Files
baseapi/utils/utils.go
2018-06-05 16:57:27 +08:00

79 lines
1.8 KiB
Go

package utils
import (
"bytes"
"encoding/json"
"reflect"
)
func DictKeysMan(data interface{}, keysToRemove []string, keysToKeep []string) interface{} {
if data == nil || (keysToKeep == nil && keysToRemove == nil) {
return data
}
var keysToRemoveMap map[string]int
var keysToKeepMap map[string]int
if keysToKeep != nil {
keysToKeepMap = make(map[string]int)
for _, v := range keysToKeep {
keysToKeepMap[v] = 1
}
} else if keysToRemove != nil {
keysToRemoveMap = make(map[string]int)
for _, v := range keysToRemove {
keysToRemoveMap[v] = 1
}
}
dataIsSlice := true
valueOfData := reflect.ValueOf(data)
if valueOfData.Kind() != reflect.Slice {
dataIsSlice = false
valueOfData = reflect.ValueOf([]interface{}{data})
} else if valueOfData.Len() == 0 {
return data
}
retVal := make([]interface{}, valueOfData.Len())
for index := 0; index < valueOfData.Len(); index++ {
realV := valueOfData.Index(index)
if realV.Kind() == reflect.Interface || realV.Kind() == reflect.Ptr {
realV = realV.Elem()
}
if keysToRemoveMap != nil || keysToKeepMap != nil {
mapV := make(map[string]interface{})
for _, key := range realV.MapKeys() {
fieldName := key.String()
wantThisField := true
if keysToKeepMap != nil {
if _, ok := keysToKeepMap[fieldName]; !ok {
wantThisField = false
}
} else if keysToRemoveMap != nil {
if _, ok := keysToRemoveMap[fieldName]; ok {
wantThisField = false
}
}
if wantThisField {
mapV[fieldName] = realV.MapIndex(key)
}
}
retVal[index] = mapV
} else {
retVal[index] = realV.Interface()
}
}
if !dataIsSlice {
return retVal[0]
}
return retVal
}
func UnmarshalUseNumber(data []byte, result interface{}) error {
d := json.NewDecoder(bytes.NewReader(data))
d.UseNumber()
return d.Decode(result)
}