要做到这一点,一种方法是从encoding/json
包创建实现Unmarshaler
接口的自定义类型.Here's a link to this interface.在进行JSON反编组时,任何实现Unmarshaler
的类型都可以用作 struct 字段的类型.在进行解组时,encoding/json
将使用您实现的接口UnmarshalJSON
函数将JSON字节转换为字段类型.
因此,您可以编写一个UnmarshalJSON
函数,其中包括将字符串值更改为小写.
以下是一个例子,说明了这可能是什么样子:
type LowerCaseString string
func (l *LowerCaseString) UnmarshalJSON(bytes []byte) error {
lowerCasedString := strings.ToLower(string(bytes))
*l = LowerCaseString(lowerCasedString)
return nil
}
然后,在您的struct for JSON映射中,您可以使用您的定制类型而不是string
:
type Person struct {
FirstName LowerCaseString `json:"first_name"`
LastName LowerCaseString `json:"last_name"`
}
如果解组到这个 struct 中,FirstName和LastName的值将被小写(还要注意,您需要将它们转换回string
才能将它们用作string
).
testJSON := `{"first_name" : "TestFirstNAME", "last_name": "TestLastNAME"}`
var result Person
err := json.Unmarshal([]byte(testJSON), &result)
if err != nil { /*handle the error*/ }
fmt.Println(result.FirstName) // prints "testfirstname"
var stringLastName string
stringLastName = string(result.LastName) // need to type convert from LowerCaseString to string
fmt.Println(stringLastName) // prints "testlastname"
Here is the above code running in Go Playground.个