[英]Transform values when umarshaling
給定下面的代碼,是否可以在解組時轉換名字? 假設我希望它始終是小寫的,無論它是否在實際的 json 中。
type Person struct {
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
}
func main() {
jsonText := GetJsonFromSomewhere()
var v Person
json.Unmarshal(jsonText, &v)
}
一種方法是創建一個自定義類型,該類型從encoding/json
package 實現Unmarshaler
接口。這是該接口的鏈接。 在進行 JSON 解組時,任何實現Unmarshaler
的類型都可以用作結構字段的類型。 在進行解組時, encoding/json
將使用接口的UnmarshalJSON
function 的實現將 JSON 字節轉換為字段類型。
因此,您可以編寫一個UnmarshalJSON
function,其中包括將字符串值更改為小寫。
這是一個看起來像的例子:
type LowerCaseString string
func (l *LowerCaseString) UnmarshalJSON(bytes []byte) error {
lowerCasedString := strings.ToLower(string(bytes))
*l = LowerCaseString(lowerCasedString)
return nil
}
然后,在 JSON 映射的結構中,您可以使用自定義類型而不是string
:
type Person struct {
FirstName LowerCaseString `json:"first_name"`
LastName LowerCaseString `json:"last_name"`
}
如果你解組到這個結構中, FirstName 和 LastName 的值將被小寫(另請注意,你需要將它們類型轉換回string
以將它們用作string
s)。
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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.