为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
MM们 2021-10-18 17:26:18
我从客户端收到未知的 json 并且我解析为接口var f interface{}err := json.Unmarshal(b, &f)如何使 f 中的所有键都成为较低的键?我必须将此 f 保存到 mongo,我需要进行一些查询,但如果有人发送大写相同的 json,我想避免出错。
查看完整描述

2 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超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 对象的键转换。


操场


如果您知道您正在处理一个没有嵌套的对象,那么您可以从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


查看完整回答
反对 回复 2021-10-18
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

将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

}


查看完整回答
反对 回复 2021-10-18
  • 2 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信