我知道這可能看起來是一個常見的問題,但對我來說是裸露的......
我有一個結構,其中一個欄位型別等于另一個結構的型別:
type Developer struct {
Name string `json:"name,omitempty"`
ProjectRef *Ref `json:"project,omitempty"`
}
type Ref struct {
ID string `json:"id,omitempty"`
}
在我的實作中,我無法保證是否存在或不存在針對開發人員的 ProjectRef。如果我創建一個 ID 為 null 的 Ref,即一個空字串,那么這個欄位會從 Ref 中省略,但是,即使我的 Ref 此時沒有欄位,為什么它沒有被省略為空呢?
我想克服這個問題的一種方法是使用一堆條件陳述句,但我不想讓自己這樣做,因為我有很多需要這個功能的情況。
完整的演示代碼:
package main
import (
"encoding/json"
"fmt"
)
type Developer struct {
Name string `json:"name,omitempty"`
ProjectRef *Ref `json:"project,omitempty"`
}
type Ref struct {
ID string `json:"id,omitempty"`
}
func main() {
developer := &Developer{
Name: "Charlie",
ProjectRef: &Ref{ID: ""},
}
jsonBytes, err := json.Marshal(developer)
if err != nil {
panic(err)
}
fmt.Println(string(jsonBytes))
// {"name":"Charlie","project":{}}
}
游樂場鏈接:https ://go.dev/play/p/D2edbrACXY2
先感謝您
uj5u.com熱心網友回復:
即使結構的所有欄位都包含零值,結構也會被封送。
一種方法是離開該Developer.ProjectRef欄位nil,并洗掉該omitempty屬性。這樣它將被編組為 JSONnull值:
type Developer struct {
Name string `json:"name,omitempty"`
ProjectRef *Ref `json:"project"`
}
測驗它:
developer := &Developer{
Name: "Charlie",
}
jsonBytes, err := json.Marshal(developer)
if err != nil {
panic(err)
}
fmt.Println(string(jsonBytes))
developer.ProjectRef = &Ref{ID: "abc"}
jsonBytes, err = json.Marshal(developer)
if err != nil {
panic(err)
}
fmt.Println(string(jsonBytes))
輸出(在Go Playground上試試):
{"name":"Charlie","project":null}
{"name":"Charlie","project":{"id":"abc"}}
如果你總是想Developer.ProjectRef成為一個非nil指標,那么為 撰寫一個自定義JSON 封送器,如果 ID 為空Ref,它可以封送 JSON值:null
func (r *Ref) MarshalJSON() ([]byte, error) {
if r.ID == "" {
return []byte("null"), nil
}
type ref2 Ref
return json.Marshal((*ref2)(r))
}
測驗它:
developer := &Developer{
Name: "Charlie",
ProjectRef: &Ref{ID: ""},
}
jsonBytes, err := json.Marshal(developer)
if err != nil {
panic(err)
}
fmt.Println(string(jsonBytes))
developer.ProjectRef.ID = "abc"
jsonBytes, err = json.Marshal(developer)
if err != nil {
panic(err)
}
fmt.Println(string(jsonBytes))
輸出(在Go Playground上試試):
{"name":"Charlie","project":null}
{"name":"Charlie","project":{"id":"abc"}}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/431672.html
