1 回答

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超4個(gè)贊
在解碼方面,您可以為自定義類型編寫自定義解組器:
type MaybeInt struct {
Present bool
Null bool
Value int64
}
func (m *MaybeInt) UnmarshalJSON(data []byte) error {
s := string(data)
m.Present = true
if s == "null" {
m.Null = true
return nil
}
v, err := strconv.ParseInt(s, 10, 64)
m.Value = v
return err
}
完整的例子在這里。不幸的是,這在編碼方面不起作用:MarshalJSON處理程序無法指示該字段為空。顯而易見的方法是nil, nil從 Marshaler 返回,但這不起作用。也不回[]byte{}, nil。
你可能會(huì)想:好吧,讓我們使用一個(gè)指針,并將它設(shè)置為nil當(dāng)我們想說該字段應(yīng)該被省略時(shí)。這適用于解碼端,但現(xiàn)在編碼端失敗了,因?yàn)榫幋a器看到文字null并且根本不調(diào)用我們的編碼器!
最終,我們可以將這兩種技術(shù)結(jié)合起來:讀入MaybeInt、編碼(寫入)*MaybeInt。我們需要并行結(jié)構(gòu)類型。我們可以根據(jù)輸入類型設(shè)置輸出類型。我不認(rèn)為這很漂亮,而且其中的reflect代碼很糟糕(你也可以看到我所有的調(diào)試痕跡),但這實(shí)際上似乎有效:Playground link。在實(shí)踐中reflect,您可能只為每個(gè)“可能”值的情況編寫一個(gè)函數(shù),而不是使用 。
- 1 回答
- 0 關(guān)注
- 185 瀏覽
添加回答
舉報(bào)