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) }
代码说明
- 临时结构体定义:创建
tempTransformation作为TransformationInfo的类型别名,用来接收原始反序列化数据,避免直接操作原结构体触发递归调用问题。 - 原始数据解析:先调用标准
json.Unmarshal把JSON内容解析到临时结构体,拿到JSON里的原始字符串值。 - 常量替换逻辑:通过switch判断每个字段的原始值,匹配到预定义的常量标识后替换为对应常量值;未匹配的情况可选择保留原字符串或返回错误,按需调整即可。
- JSON格式修正:原代码中的JSON字符串里
SourceField后多了一个空格,会导致字段匹配失败,示例中已修正该问题。
运行代码后,输出结果为:transformationInfo : &{metadata+ field2}
内容的提问来源于stack exchange,提问作者Vivek Patare
相关产品推荐
相关产品推荐

