更新JSONB字段遇字符转换错误:含字母失败、数字正常
问题根源分析
你碰到的这个报错,核心问题出在**types.JSONText要求传入的是合法的JSON格式内容**,但你直接把原始IMEI字符串(比如带字母的1234b5678)塞进去了,这不符合JSON语法规则:
- 当IMEI是纯数字时,它刚好匹配JSON数字的格式,所以能被正常解析;
- 可一旦IMEI包含字母,它既不是合法的JSON数字(JSON数字不能有字母),也不是合法的JSON字符串(JSON字符串必须用双引号包裹),数据库驱动解析参数时自然就会抛出
invalid character ‘b’ looking for beginning of value的错误。
解决方案
有两种简单的修复方式,任选其一就行:
方式1:手动给IMEI字符串套双引号
把原始IMEI字符串用双引号包裹,让它变成合法的JSON字符串:
params["imei_json"] = types.JSONText("\"" + params["imei"].(string) + "\"")
这样不管IMEI是纯数字还是带字母,都会被当作合法的JSON字符串处理。
方式2:用json.Marshal生成合法JSON(更稳妥)
推荐用标准库的json.Marshal来序列化IMEI字符串,能避免手动拼接引号可能踩的坑(比如IMEI本身包含引号的情况):
imeiStr := params["imei"].(string) jsonBytes, err := json.Marshal(imeiStr) if err != nil { return err // 处理序列化错误 } params["imei_json"] = types.JSONText(jsonBytes)
修改后的完整函数示例
import ( "encoding/json" "fmt" ) // Update User Information func (metadata *accountPhoneNumberMetadata) UpdateUserInfo(params map[string]interface{}) error { // 先做类型断言检查,让代码更健壮 imeiStr, ok := params["imei"].(string) if !ok { return fmt.Errorf("invalid imei type: expected string") } // 用方式2的写法处理JSON序列化 jsonBytes, err := json.Marshal(imeiStr) if err != nil { return err } params["imei_json"] = types.JSONText(jsonBytes) // 后续执行你的SQL更新逻辑... return nil }
内容的提问来源于stack exchange,提问作者Igor Khristenko
相关产品推荐
相关产品推荐

