Go语言JSON反序列化时能否自动将FirstName转为小写?
在Go中JSON反序列化时自动转换字段为小写
完全可以实现这个需求,下面给两种实用方案:
方案一:自定义类型实现反序列化接口(推荐,可复用)
通过给字符串类型自定义一个实现json.Unmarshaler接口的包装类型,让反序列化过程自动完成小写转换:
import ( "encoding/json" "strings" ) // 自定义一个用于自动转小写的字符串类型 type LowercaseString string // 实现json.Unmarshaler接口 func (ls *LowercaseString) UnmarshalJSON(data []byte) error { var rawStr string // 先把JSON数据反序列化成普通字符串 if err := json.Unmarshal(data, &rawStr); err != nil { return err } // 转成小写后赋值给自定义类型 *ls = LowercaseString(strings.ToLower(rawStr)) return nil } // 修改Person结构体,把FirstName的类型换成自定义类型 type Person struct { FirstName LowercaseString `json:"first_name"` LastName string `json:"last_name"` } func main() { jsonText := GetJsonFromSomewhere() var v Person if err := json.Unmarshal(jsonText, &v); err != nil { // 这里处理反序列化错误 panic(err) } // 如果需要把LowercaseString当作普通string使用,直接类型转换即可 firstName := string(v.FirstName) }
方案二:反序列化后手动转换(简单场景适用)
如果只是单个地方需要处理,直接在反序列化完成后手动调用strings.ToLower转换:
import ( "encoding/json" "strings" ) type Person struct { FirstName string `json:"first_name"` LastName string `json:"last_name"` } func main() { jsonText := GetJsonFromSomewhere() var v Person if err := json.Unmarshal(jsonText, &v); err != nil { // 处理错误 panic(err) } // 手动转小写 v.FirstName = strings.ToLower(v.FirstName) }
内容的提问来源于stack exchange,提问作者Raouf Ben Hassine
相关产品推荐
相关产品推荐

