結構體欄位的多個JSON 標籤
在從伺服器接收JSON 資料並需要將其解組到結構體的場景中,您可能會遇到這樣的情況:您想要使用不同的JSON標籤來表示相同的資料
自訂 JSON 標籤
JSON 標籤指定 JSON 表示中使用的欄位名稱。預設情況下,欄位的標籤與欄位名稱相同。但是,您可以自訂標籤以變更序列化或反序列化結構時使用的名稱。
單一 JSON 標籤
使用單一 JSON 標籤非常簡單。只需將所需的標籤指定為字串文字:
type Foo struct { Name string `json:"name"` Age int `json:"age"` }
多個JSON 標籤
如問題中所述,不可能將多個JSON標籤直接附加到單一字段。但是,有一種技術可以讓您解決此限制。
結構體轉換
給定的解決方案建議使用兩個具有相同字段佈局的結構體。例如:
type Foo struct { Name string Age int } type Bar struct { Name string `json:"employee_name"` Age int `json:"-"` }
然後,您可以將 Foo 結構轉換為 Bar 結構以變更 JSON 標籤。當您有大量欄位時,此技術特別有用:
foo := Foo{Name: "Sam", Age: 20} bar := (*Bar)(unsafe.Pointer(&foo))
注意
請務必注意,應取消匯出第二個結構以防止這種情況防止在當前包之外被存取。這可確保僅按預期執行轉換,而不會意外誤用。
範例
以下程式碼示範了上述轉換技術:
package main import ( "encoding/json" "fmt" ) type Foo struct { Name string Age int } type Bar struct { Name string `json:"employee_name"` Age int `json:"-"` } func main() { foo := Foo{Name: "Sam", Age: 20} bar := (*Bar)(unsafe.Pointer(&foo)) jsonBytes, err := json.Marshal(bar) if err != nil { fmt.Println(err) return } fmt.Println(string(jsonBytes)) }
此程式碼使用Bar 結構中定義的JSON 標籤成功序列化Foo結構資料。它產生以下 JSON 輸出:
{"employee_name":"Sam"}
以上是如何在 Go 中對單一結構體欄位使用多個 JSON 標籤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!