首頁 >後端開發 >Golang >當金鑰不存在時處理 PATCH 部分更新

當金鑰不存在時處理 PATCH 部分更新

王林
王林轉載
2024-02-09 15:39:18842瀏覽

当密钥不存在时处理 PATCH 部分更新

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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除