Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann das Problem des Fehlers bei der Deserialisierung von Attributwerten gelöst werden?

Wie kann das Problem des Fehlers bei der Deserialisierung von Attributwerten gelöst werden?

零下一度
零下一度Original
2017-06-23 16:22:114247Durchsuche

Einführung: Als ich die Webapi-Schnittstelle entwickelte, stieß ich auf Folgendes: Wenn eine komplexe JSON-Zeichenfolge in ein Objekt deserialisiert wird, kann eines der Attributobjekte nicht serialisiert werden?

Verwendung:

InternalRecommendRequestFormModel formData = Newtonsoft.Json.JsonConvert.DeserializeObject<InternalRecommendRequestFormModel>(dataInput);

Darunter: InternalRecommendRequestFormModel ist ein komplexes Objekt, und seine Eigenschaften enthalten andere Objekte und Eigenschaften. dataInput ist die von der Schnittstelle übergebene JSON-Zeichenfolge, bei der es sich um das von einer anderen Schnittstelle zurückgegebene InternalRecommendRequestFormModel-Objekt handelt. Natürlich haben sich einige Eigenschaften der Daten während des Übertragungsprozesses geändert. Sie sollten jedoch deserialisiert werden, wenn sie verwendet werden Es wird ein Fehler gemeldet und eines der Attribute kann nicht serialisiert werden.

Was sollen wir also tun, wenn wir auf eine solch komplexe Deserialisierung in Objekte stoßen?

Zuallererst: Die Analyse zeigt, dass der Fehler durch den Serialisierungsfehler einzelner Attribute verursacht wird. Solange diese Attribute gelöscht oder der serialisierte Inhalt des Attributs entfernt werden können, ist alles in Ordnung.

Also: Wie entferne ich einige Attribute aus der serialisierten JSON-Zeichenfolge?

Das erste, woran wir denken, ist das Ersetzen von Saiten, das Löschen, das Abfangen usw., aber es ist leicht, Fehler zu machen. Können wir diese Zeichenfolge in ein funktionsfähiges Objekt umwandeln (natürlich nicht InternalRecommendRequestFormModel), dann ein Objekt töten oder löschen und es dann in das gewünschte Objekt konvertieren? Als ich zum ersten Mal über ein Objekt nachdachte: Ist eigentlich nicht jedes Objekt ein Objekt?

Beginnen Sie mit dem Versuch:

object formData = Newtonsoft.Json.JsonConvert.DeserializeObject<object>(dataInput);

Das erhaltene Objekt ist wie folgt:

Beim Debuggen entdeckt:

((Newtonsoft.Json.Linq.JObject)(JsonConvert.DeserializeObject(dataInput))).ChildrenTokens[46], ich kann den Attributwert abrufen.

Mit anderen Worten, wie aus dem obigen Code ersichtlich ist, wird das deserialisierte Objektobjekt in Folgendes konvertiert: Newtonsoft.Json.Linq.JObject-Objekt. Dieses Objekt ist eine Basisklasse des von Microsoft bereitgestellten JSON-Objekts. Das heißt, solange Sie ein Objekt sind und es von JSON serialisiert wird, kann es Ihnen dabei helfen, es wieder zu deserialisieren.

Der Code wurde verbessert zu:

InternalRecommendRequestFormModel formData = new InternalRecommendRequestFormModel();Newtonsoft.Json.Linq.JObject obj = JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(dataInput);
obj.Remove("opinions");
formData = obj.ToObject<InternalRecommendRequestFormModel>();

Zusammenfassung:

Solange die JSON-Zeichenfolge ein Objekt ist und wir direkt deserialisieren und feststellen, dass einige Attributwerte in der Zeichenfolge nicht den Anforderungen entsprechen, können wir das Objekt zunächst in JObject konvertieren und die Objektattribute korrigieren , und verwenden Sie dann JObject, um ToObject() bereitzustellen und es dann in das Objekt zu konvertieren, das konvertiert werden muss

<strong><span style="font-size: 15px">Newtonsoft.Json.Linq.JObject obj = JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(dataInput);</span></strong><br>

Das obige ist der detaillierte Inhalt vonWie kann das Problem des Fehlers bei der Deserialisierung von Attributwerten gelöst werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn