60 lines
1.1 KiB
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)
|
||
|
}
|