Go 使用reflect将所有属性设置为小写或大写?

Go 使用reflect将所有属性设置为小写或大写?,go,Go,我从客户端接收到未知的json,并解析到如下接口 var f interface{} err := json.Unmarshal(b, &f) 如何使f中的所有键都成为较低的键? 我必须将这个f保存到mongo,我需要进行一些查询,但我想避免错误,如果有人发送大写的相同json。它将是map[string]interface{},所以请检查它并简单地将键转换为小写 var f map[string]interface{} ... converted := make(map[strin

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

var f interface{}
err := json.Unmarshal(b, &f)
如何使f中的所有键都成为较低的键?
我必须将这个f保存到mongo,我需要进行一些查询,但我想避免错误,如果有人发送大写的相同json。

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

它将是
map[string]接口{}
,所以请检查它并简单地将键转换为小写

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

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

这里有一种方法:

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对象的键转换

如果您知道正在使用未嵌套的对象,则可以从
下部
内联贴图大小写:

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

这里有一种方法:

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对象的键转换

如果您知道正在使用未嵌套的对象,则可以从
下部
内联贴图大小写:

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

在第二种情况下,您还需要递归地迭代映射值:
对于k,v:=range f{lf[strings.ToLower(k)]=lower(v)}
在第二种情况下,您还需要递归地迭代映射值:
对于k,v:=range f{lf[strings.ToLower(k)]=lower(v)}