Maison >développement back-end >Golang >Gestion des mises à jour partielles PATCH lorsque la clé n'existe pas

Gestion des mises à jour partielles PATCH lorsque la clé n'existe pas

王林
王林avant
2024-02-09 15:39:18842parcourir

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

L'éditeur php d'Apple est là pour partager avec vous un problème concernant la clé qui n'existe pas lors du traitement de certaines mises à jour. Lorsque vous effectuez une requête PATCH, vous rencontrez parfois une situation dans laquelle la clé n'existe pas. Alors, comment devrions-nous y faire face ? Dans cet article, nous présenterons en détail les méthodes et les étapes pour résoudre ce problème afin de vous aider à mieux gérer cette situation et à assurer le fonctionnement normal du système. Nous allons jeter un coup d'oeil!

Contenu de la question

J'essaie de comprendre comment résoudre ce problème.

J'ai un type user 结构,上面有一些字段。但是,当为 patch 用户调用解码 json 对象时,缺少键会导致值设置为 *nil。对应的数据库属性是 text null donc lorsque la clé est manquante, le résultat sera toujours stocké comme nul.

type updateuserdto struct {
  id         uuid.uuid
  firstname  string
  lastname   string
  imageurl  *string
}

imageurl peut être nul, mais lorsque l'objet est envoyé par le client :

{ firstName: "Jimmy" }

Ceci se décode comme imageurl = nil,因为 json 中不存在 imageurl = nul car

n'existe pas en json.

map[string]struct{} 而不是我的 dto 检查每个字段是否存在的情况下处理部分更新?

解决方法

您可以实现自定义json.unmarshaler来确定是否该字段被完全省略,已提供但其值为 nullComment puis-je gérer les mises à jour partielles sans utiliser map[string]struct{} au lieu de mon dto vérifiant si chaque champ existe ?

SolutionVous pouvez implémenter un json.unmarshaler

personnalisé pour déterminer si le Le champ a été entièrement omis, a été fourni mais sa valeur était null, ou une valeur non nulle a été fournie.

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.decoder (由 json.unmarshalUne autre méthode qui ne nécessite pas de type personnalisé consiste à définir la valeur du champ go sur

la valeur de la

colonne de base de données actuelle avant de démarshaler le json. Si le json entrant ne contient pas de champs correspondants, alors

en utilisant ) ne "touchera" pas les champs de la cible. 🎜
dto := loadUpdateUserDTOFromDB(conn)
if err := json.Unmarshal(data, dto); err != nil {
    return err
}
🎜🎜https://www.php.cn/link/cdf49f5251e7b3eb4f009483121e9b64🎜🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer