我有一个随机的JSON(我不会提前知道架构)我正在编组map[string]interface{}
。
我还有一个字符串表示我想要返回的字段值,类似于"SomeRootKey.NestValue.AnotherNestValue"
我希望能够返回该值。有没有一种简单的方法可以在不做一些递归技巧的情况下访问该值?
答案 0 :(得分:1)
没有递归?是的,使用循环,但没有没有神奇的方法来做到这一点。
func getKey(m interface{}, key string) (string, bool) {
L:
for _, k := range strings.Split(key, ".") {
var v interface{}
switch m := m.(type) {
case map[string]interface{}:
v = m[k]
case []interface{}:
idx, err := strconv.Atoi(k)
if err != nil || idx > len(m) {
break L
}
v = m[idx]
default:
break L
}
switch v := v.(type) {
case map[string]interface{}:
m = v
case []interface{}:
m = v
case string:
return v, true
default:
break L
}
}
return "", false
}
使用json:
{
"SomeRootKey": {
"NestValue": {"AnotherNestValue": "object value"},
"Array": [{"AnotherNestValue": "array value"}]
}
}
您可以使用:
fmt.Println(getKey(m, "SomeRootKey.NestValue.AnotherNestValue"))
fmt.Println(getKey(m, "SomeRootKey.Array.0.AnotherNestValue"))