79 lines
1.8 KiB
Go
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)
|
|
}
|