gosocketio/json/json.go

60 lines
1.1 KiB
Go

package json
import (
"encoding/json"
"reflect"
"strconv"
"strings"
)
// JSON对象接口 支持按属性路径访问属性
type JSONObject struct {
m map[string]interface{}
}
func (j *JSONObject) UnmarshalJSON(data []byte) error {
err := json.Unmarshal(data, &j.m)
if err != nil {
return err
}
return nil
}
func (j *JSONObject) getBySlice(path []string) interface{} {
if len(j.m) == 1 {
data, ok := j.m["data"]
if ok && reflect.TypeOf(data).Kind() == reflect.Slice {
index, _ := strconv.Atoi(path[0])
v := data.([]interface{})[index]
if len(path) == 1 {
return v
}
if reflect.ValueOf(v).Kind() == reflect.Map {
t := JSONObject{m: v.(map[string]interface{})}
return t.getBySlice(path[1:])
}
return nil
}
}
v, ok := j.m[path[0]]
if !ok {
return nil
}
if len(path) == 1 {
return v
}
if reflect.ValueOf(v).Kind() == reflect.Map {
t := JSONObject{m: v.(map[string]interface{})}
return t.getBySlice(path[1:])
}
return nil
}
// @title 获取属性
// @param path 属性路径,以'.'分割
func (j *JSONObject) Get(path string) interface{} {
paths := strings.Split(path, ".")
return j.getBySlice(paths)
}