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) }