You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

更新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:44:05