php小編蘋果今天來跟大家分享一個處理部分更新時金鑰不存在的問題。在進行PATCH請求時,有時會遇到金鑰不存在的情況。那我們該如何處理呢?在本文中,將為大家詳細介紹解決這問題的方法和步驟,幫助大家更好地應對這種情況,並確保系統的正常運作。讓我們一起來看看吧!
我正在想辦法解決這個問題。
我有一個 user
結構,上面有一些欄位。但是,當為 patch 使用者呼叫解碼 json 物件時,缺少鍵會導致值設定為 *nil。對應的資料庫屬性是 text null
類型,因此當 key 遺失時,結果將始終儲存為 null。
type updateuserdto struct { id uuid.uuid firstname string lastname string imageurl *string }
imageurl
可以為 nil,但是當該物件從客戶端發送時:
{ firstName: "Jimmy" }
這會解碼為 imageurl
= nil,因為 json 中不存在 imageurl
。
如何在不使用 map[string]struct{}
而不是我的 dto 檢查每個欄位是否存在的情況下處理部分更新?
您可以實作自訂json.unmarshaler
來決定是否該欄位完全省略,已提供但其值為null
,或提供了非空值。
type optstring struct { isvalid bool string *string } // if a field with this type has no corresponding field in the // incoming json then this method will not be invoked and the // isvalid flag's value will remain `false`. func (s *optstring) unmarshaljson(data []byte) error { if err := json.unmarshal(data, &s.string); err != nil { return err } s.isvalid = true return nil }
type updateuserdto struct { id uuid.uuid firstname string lastname string imageurl optstring }
https://www.php.cn/link/22f791da07b0d8a2504c2537c560001c
另一種不需要自訂類型的方法是在解組 json 之前將 go 欄位的值設為目前資料庫列的值。如果傳入的 json 不包含符合的字段,則 json.decoder
(由 json.unmarshal
使用)將不會「觸及」目標的字段。
dto := loadUpdateUserDTOFromDB(conn) if err := json.Unmarshal(data, dto); err != nil { return err }
https://www.php.cn/link/cdf49f5251e7b3eb4f009483121e9b64
以上是當金鑰不存在時處理 PATCH 部分更新的詳細內容。更多資訊請關注PHP中文網其他相關文章!