Go语言 使用reflect使所有属性小写还是大写?

yiytaume  于 2023-02-27  发布在  Go
关注(0)|答案(2)|浏览(146)

我正在从客户端接收未知json,并解析为如下接口

var f interface{}
err := json.Unmarshal(b, &f)

如何使所有的键在f是小写键?我必须保存这个f到mongo,我需要做一些查询,但我想避免错误,如果有人发送大写相同的json。

q8l4jmvw

q8l4jmvw1#

这里有一个方法可以做到这一点:

var v any
err := json.Unmarshal(b, &v)
v = lower(v)

其中较低的是:

func lower(v any) any {
    switch v := v.(type) {
    case []any:
        lv := make([]any, len(v))
        for i := range v {
            lv[i] = lower(v[i])
        }
        return lv
    case map[string]any:
        lv := make(map[string]any, len(v))
        for mk, mv := range v {
            lv[strings.ToLower(mk)] = mv
        }
        return lv
    default:
        return v
    }
}

lower函数递归地调用自身来处理嵌套JSON对象和数组中的键转换。
playground
如果你知道你正在处理一个没有嵌套的对象(对象字段不包含数组或其他对象),那么你可以从上面的lower函数内联map case:

var v map[string]any
err := json.Unmarshal(b, &v)
lv := make(map[string]any, len(v))
for mk, mv := range v {
    lv[strings.ToLower(mk)] = mv
}
v = lv
wfauudbj

wfauudbj2#

它将是map[string]interface{},所以仔细检查一下,简单地将键转换为小写。

var f map[string]interface{}
...

converted := make(map[string]interface{}, len(f))
for k, v := range f {
    converted[strings.ToLower(k)] = v
}

相关问题