1 回答

TA貢獻1825條經驗 獲得超4個贊
在解碼方面,您可以為自定義類型編寫自定義解組器:
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。
你可能會想:好吧,讓我們使用一個指針,并將它設置為nil當我們想說該字段應該被省略時。這適用于解碼端,但現在編碼端失敗了,因為編碼器看到文字null并且根本不調用我們的編碼器!
最終,我們可以將這兩種技術結合起來:讀入MaybeInt、編碼(寫入)*MaybeInt。我們需要并行結構類型。我們可以根據輸入類型設置輸出類型。我不認為這很漂亮,而且其中的reflect代碼很糟糕(你也可以看到我所有的調試痕跡),但這實際上似乎有效:Playground link。在實踐中reflect,您可能只為每個“可能”值的情況編寫一個函數,而不是使用 。
- 1 回答
- 0 關注
- 179 瀏覽
添加回答
舉報