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

Go语言中JSON反序列化时将字符串值替换为已定义常量

解决JSON反序列化时替换字符串为常量值的问题

要实现你需要的效果,核心是给TransformationInfo结构体自定义json.Unmarshaler接口的实现,在反序列化过程中完成字符串到常量值的替换。

完整代码示例

package main

import (
	"encoding/json"
	"fmt"
)

const (
	temp  = "metadata+"
	temp2 = "field2"
)

type TransformationInfo struct {
	SourceField string
	DestField   string
}

// 自定义UnmarshalJSON方法,实现json.Unmarshaler接口
func (t *TransformationInfo) UnmarshalJSON(data []byte) error {
	// 定义临时结构体,避免递归调用UnmarshalJSON
	type tempTransformation TransformationInfo
	var tempInfo tempTransformation

	// 先将JSON数据反序列化到临时结构体
	if err := json.Unmarshal(data, &tempInfo); err != nil {
		return err
	}

	// 替换字段值为对应常量
	switch tempInfo.SourceField {
	case "temp":
		t.SourceField = temp
	default:
		// 如果没有匹配的常量,保留原字符串(也可以根据需求返回错误)
		t.SourceField = tempInfo.SourceField
	}

	switch tempInfo.DestField {
	case "temp2":
		t.DestField = temp2
	default:
		t.DestField = tempInfo.DestField
	}

	return nil
}

func main() {
	transformationInfo := new(TransformationInfo)
	// 修正原JSON里SourceField的多余空格,避免字段匹配失败
	js := `{"SourceField": "temp", "DestField": "temp2"}`
	err := json.Unmarshal([]byte(js), transformationInfo)
	if err != nil {
		fmt.Printf("Unmarshal error: %v\n", err)
		return
	}
	fmt.Printf("transformationInfo : %v\n", transformationInfo)
}

代码说明

  1. 临时结构体定义:创建tempTransformation作为TransformationInfo的类型别名,用来接收原始反序列化数据,避免直接操作原结构体触发递归调用问题。
  2. 原始数据解析:先调用标准json.Unmarshal把JSON内容解析到临时结构体,拿到JSON里的原始字符串值。
  3. 常量替换逻辑:通过switch判断每个字段的原始值,匹配到预定义的常量标识后替换为对应常量值;未匹配的情况可选择保留原字符串或返回错误,按需调整即可。
  4. JSON格式修正:原代码中的JSON字符串里SourceField后多了一个空格,会导致字段匹配失败,示例中已修正该问题。

运行代码后,输出结果为:transformationInfo : &{metadata+ field2}

内容的提问来源于stack exchange,提问作者Vivek Patare

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:03:12