思路:一层一层迭代
package main
import (
"encoding/json"
"errors"
"fmt"
"reflect"
)
//直接通过map迭代
func findJsonByPath(jsonStr string, path []string) (interface{
}, error) {
jsonMap := map[string]interface{
}{
}
//首先反序列化json为map
err := json.Unmarshal([]byte(jsonStr), &jsonMap)
if err != nil {
return nil, err
}
depth := ""
cur := jsonMap //通过反射获取map的值
//一层一层迭代
for i := 0; i < len(path); i++ {
key := path[i]
depth += "/" + key
tmpVal, exist := cur[key]
if !exist {
//判断key是否存在
return nil, errors.New("can not find " + depth)
}
if reflect.TypeOf(tmpVal).Kind() == reflect.Map {
cur = tmpVal.(map[string]interface{
}) //重新赋值当前位置
} else {
cur = map[string]interface{
}