Golang JSON解码校验失效:interface{}不报错的原因与修复
Golang JSON解码:使用interface{}后不再校验类型的原因及修复方案
问题原因
之前直接用CloudSettings类型变量解码时,encoding/json包明确知道要把JSON字段映射到结构体的*bool类型字段,所以会尝试将字符串"Junk"转换为bool类型,转换失败就抛出错误。
但改成var settings interface{}后,解码逻辑变了:当解码目标是空接口时,encoding/json会根据JSON值的原生类型自动推断对应的Go类型——比如JSON字符串会被解析成Go的string类型存入接口,完全不会去匹配结构体里的字段类型要求,相当于跳过了类型校验环节,自然不会报错。
修复方案
不要给settings赋值为结构体实例,而是赋值为结构体指针,这样Decode时依然能获取到明确的目标类型,从而执行字段类型校验。示例代码:
var settings interface{} // 根据请求头判断配置类型 if isLocalConfig { settings = &LocalSettings{} } else { settings = &CloudSettings{} } // 直接解码到settings(已经是指针,无需取地址) err = json.NewDecoder(request.Body).Decode(settings)
这样修改后,遇到不符合类型的JSON值时,依然会抛出和之前一样的转换错误,同时也避免了定义两个独立变量导致的代码重复。
如果后续需要操作配置里的具体字段,可以通过类型断言转换回具体类型:
switch s := settings.(type) { case *CloudSettings: // 处理云端配置的逻辑 case *LocalSettings: // 处理本地配置的逻辑 }
内容的提问来源于stack exchange,提问作者viral_mutant
相关产品推荐
相关产品推荐

