使用反射使所有属性小写或大写?

时间:2015-07-09 15:24:27

标签: go

我从客户端收到未知的json,我解析为接口,如

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

如何使f中的所有键都为低键? 我必须将此f保存到mongo并且我需要进行一些查询但是我想避免错误,如果有人发送大写相同的json。

2 个答案:

答案 0 :(得分:3)

它将是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
}

答案 1 :(得分:2)

以下是一种方法:

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

低位是:

func lower(f interface{}) interface{} {
  switch f := f.(type) {
  case []interface{}:
    for i := range f {
        f[i] = lower(f[i])
    }
    return f
  case map[string]interface{}:
    lf := make(map[string]interface{}, len(f))
    for k, v := range f {
        lf[strings.ToLower(k)] = lower(v)
    }
    return lf
  default:
    return f
  }
}

函数lower是递归的,用于处理嵌套JSON对象的密钥转换。

playground

如果您知道自己正在使用没有嵌套的对象,那么可以从lower内联地图案例:

var f map[string]interface{}
err := json.Unmarshal(b, &f)
lf := make(map[string]interface{}, len(f))
for k, v := range f {
    lf[strings.ToLower(k)] = v
}
f = lf