Golang中JSON扁平化处理时如何将null值转换为空字符串
Go 实现JSON扁平化时保留null值转空串方案
问题本质
null值丢失的核心原因是:现有扁平化递归逻辑遍历到JSON null(对应Go反序列化结果中的nil值)时直接跳过节点,未将对应层级key写入结果map。
方案1:自定义递归实现(无额外依赖,最可控)
不需要引入第三方库,直接调整递归遍历逻辑,遇到nil节点时不跳过,直接给拼接完成的层级key赋值空字符串即可,参考实现:
import ( "encoding/json" "fmt" "strings" ) // Flatten 扁平化JSON,null值自动转空字符串 func Flatten(prefix string, value interface{}, result map[string]string) { switch v := value.(type) { case map[string]interface{}: for k, nestedVal := range v { fullKey := k if prefix != "" { fullKey = prefix + "." + k } Flatten(fullKey, nestedVal, result) } case []interface{}: // 业务需要处理数组可打开这段逻辑,key格式为 parent.0 形式 // for idx, nestedVal := range v { // fullKey := fmt.Sprintf("%d", idx) // if prefix != "" { // fullKey = prefix + "." + fullKey // } // Flatten(fullKey, nestedVal, result) // } case nil: // 核心逻辑:遇到null值直接赋值空串,不跳过 result[prefix] = "" default: // 其余基础类型直接转字符串存储,可根据业务需要调整类型转换规则 result[prefix] = fmt.Sprintf("%v", v) } }
调用示例:
func main() { jsonStr := `{ "foo": { "jim":null }, "fee":"bar" }` var data map[string]interface{} // 反序列化建议开启UseNumber,避免数字类型默认转float64带来精度问题 decoder := json.NewDecoder(strings.NewReader(jsonStr)) decoder.UseNumber() _ = decoder.Decode(&data) res := make(map[string]string) Flatten("", data, res) fmt.Println(res) // 输出 map[fee:bar foo.jim:] }
方案2:基于现有JSON库配置改造
如果项目已经引入第三方JSON处理/扁平化工具,不需要重写逻辑,只需要调整两处配置:
- 关闭扁平化工具默认开启的「忽略null/空值」开关
- 自定义null值的映射规则,将所有null节点的输出值设置为空字符串
""
注意事项
- 如果业务场景包含数组结构,在递归逻辑里补充数组下标的key拼接规则即可,格式可根据业务要求调整为
key.0、key[0]等形式 - 不建议用固定结构体反序列化后再做扁平化,结构体静态类型会把null值转为对应类型的零值,无法区分「字段值为类型零值」和「字段值为null」的场景
内容的提问来源于stack exchange,提问作者Abhishek Karigar
相关产品推荐
相关产品推荐

