簡體   English   中英

整理時轉換值

[英]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"

這是在 Go Playground 中運行的上述代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM