访问Go映射中的嵌套值

访问Go映射中的嵌套值,go,Go,我有一个随机的JSON(我不会提前知道模式),我正在将它编组到map[string]接口{}。 我还有一个字符串,表示要返回的字段值,类似于“SomeRootKey.NestValue.AnotherNestValue” 我希望能够返回该值。有没有一种简单的方法可以访问该值而无需执行一些递归技巧?无需递归?是的,使用循环,但没有神奇的方法 func getKey(m interface{}, key string) (string, bool) { L: for _, k := rang

我有一个随机的JSON(我不会提前知道模式),我正在将它编组到
map[string]接口{}
。 我还有一个字符串,表示要返回的字段值,类似于
“SomeRootKey.NestValue.AnotherNestValue”


我希望能够返回该值。有没有一种简单的方法可以访问该值而无需执行一些递归技巧?

无需递归?是的,使用循环,但没有神奇的方法

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

这对阵列不起作用,是吗?类似于“a.b[0].val”的内容