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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:57:20