Der PHP-Editor von Apple ist hier, um Ihnen ein Problem mitzuteilen, bei dem der Schlüssel bei der Verarbeitung einiger Updates nicht vorhanden ist. Wenn Sie eine PATCH-Anfrage stellen, kommt es manchmal vor, dass der Schlüssel nicht vorhanden ist. Wie sollen wir also damit umgehen? In diesem Artikel stellen wir die Methoden und Schritte zur Lösung dieses Problems im Detail vor, damit Sie besser mit dieser Situation umgehen und den normalen Betrieb des Systems sicherstellen können. Lass uns einen Blick darauf werfen!
Ich versuche herauszufinden, wie ich dieses Problem lösen kann.
Ich habe einen user
结构,上面有一些字段。但是,当为 patch 用户调用解码 json 对象时,缺少键会导致值设置为 *nil。对应的数据库属性是 text null
-Typ, sodass das Ergebnis immer als Null gespeichert wird, wenn der Schlüssel fehlt.
type updateuserdto struct { id uuid.uuid firstname string lastname string imageurl *string }
imageurl
kann Null sein, aber wenn das Objekt vom Client gesendet wird:
{ firstName: "Jimmy" }
Dies wird als imageurl
= nil,因为 json 中不存在 imageurl
= Null dekodiert, da
map[string]struct{}
而不是我的 dto 检查每个字段是否存在的情况下处理部分更新?
您可以实现自定义json.unmarshaler
来确定是否该字段被完全省略,已提供但其值为 null
Wie kann ich mit Teilaktualisierungen umgehen, ohne map[string]struct{}
zu verwenden, anstatt dass mein DTO prüft, ob jedes Feld vorhanden ist?
LösungSie können benutzerdefinierte json.unmarshaler
null
, oder es wurde ein Wert ungleich Null angegeben.
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
Eine andere Möglichkeit, die keinen benutzerdefinierten Typ erfordert, besteht darin, den Wert des Feldes „go“ auf den Wert der aktuellen Datenbankspalte zu setzen, bevor der JSON entmarshaliert wird. Wenn der eingehende JSON keine passenden Felder enthält, werden die Felder des Ziels durch die Verwendung von ) nicht „berührt“.
dto := loadUpdateUserDTOFromDB(conn) if err := json.Unmarshal(data, dto); err != nil { return err }
https://www.php.cn/link/cdf49f5251e7b3eb4f009483121e9b64
Das obige ist der detaillierte Inhalt vonBehandeln von PATCH-Teilaktualisierungen, wenn der Schlüssel nicht vorhanden ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!