访问Go地图中的嵌套值

时间:2014-10-06 03:27:30

标签: go

我有一个随机的JSON(我不会提前知道架构)我正在编组map[string]interface{}。 我还有一个字符串表示我想要返回的字段值,类似于"SomeRootKey.NestValue.AnotherNestValue"

我希望能够返回该值。有没有一种简单的方法可以在不做一些递归技巧的情况下访问该值?

1 个答案:

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

playground