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!
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
map[string]struct{}
而不是我的 dto 检查每个字段是否存在的情况下处理部分更新?
您可以实现自定义json.unmarshaler
来确定是否该字段被完全省略,已提供但其值为 null
Comment 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
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 }
json.decoder
(由 json.unmarshal
Une 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 }
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!