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

如何使用GORM更新JSON类型字段?遇空值/映射问题求解

解决GORM更新JSON字段的null值与JSON值问题

针对你遇到的两个问题,分别给出具体解决方法:

1. 结构体Updates无法更新null值

GORM的Updates方法默认会跳过零值字段(包括nil指针),要更新为null,需显式指定要更新的字段,确保GORM不会忽略该字段的nil值:

// 实例化结构体,将JSON字段设为nil,同时指定要更新的字段
targetID := "your-id-here"
db.Model(&test{}).Where("id = ?", targetID).Select("lead_score_components").Updates(test{
    LeadScoreComponents: nil,
})

若需同时更新多个字段,把字段名依次加入Select参数即可,比如Select("lead_score_components", "other_field")。

2. 使用map更新JSON值时报错

直接传入map[string]interface{}中的JSON对象会因类型不兼容报错,需先将JSON数据序列化为datatypes.JSON类型再传入:

场景1:更新为JSON对象

import "encoding/json"

// 构造要存储的JSON数据
jsonContent := map[string]interface{}{
    "score": 90,
    "tags": []string{"vip", "new"},
}
// 序列化为字节数组,再转为datatypes.JSON
jsonBytes, _ := json.Marshal(jsonContent)

updateMap := map[string]interface{}{
    "lead_score_components": datatypes.JSON(jsonBytes),
}

targetID := "your-id-here"
db.Model(&test{}).Where("id = ?", targetID).Updates(updateMap)

场景2:更新为空数组

直接构造空数组的JSON字节即可:

updateMap := map[string]interface{}{
    "lead_score_components": datatypes.JSON("[]"),
}
db.Model(&test{}).Where("id = ?", targetID).Updates(updateMap)

场景3:更新为null

用map更新null值时,直接传入nil即可:

updateMap := map[string]interface{}{
    "lead_score_components": nil,
}
db.Model(&test{}).Where("id = ?", targetID).Updates(updateMap)

额外提示

如果业务中频繁处理这类JSON字段更新,可以封装工具函数,将任意JSON序列化数据转为datatypes.JSON,减少重复代码。

内容的提问来源于stack exchange,提问作者Piyush Verma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:03:26