8 Stimmen

Wenn deserializing JSON aus einem C#-Programm, sollte ich jemals brauchen, um etwas anderes als JavaScriptSerializer verwenden?

.NET bietet die JavaScriptSerializer-Klasse im Namespace System.Web.Script.Serialization. (bereitgestellt in System.Web.Extensions.dll)

Ursprünglich war sie zur Unterstützung von AJAX-Web-Server-Anwendungen gedacht, aber die Klasse kann von jeder Anwendung (Client, Server, Hybrid, alles) verwendet werden, die .NET-Klassen in JSON serialisiert und deserialisiert. Ich habe eine Desktop-Anwendung, die Screenshots aufnimmt und auf Facebook hochlädt, und diese Klasse verwendet, um die Antwort zu deserialisieren.

würde ich jemals anderswo für JSON Deserialisierung von innerhalb von .NET suchen wollen?

Wenn ja, warum? und wo würde ich suchen?


Wenn nicht, warum gibt es dann JSON.Net? Ist es ausschließlich für historische Zwecke? (dh, weil es von der Gemeinschaft vor dem JavaScriptSerializer erstellt wurde).

1voto

gillyb Punkte 8377

Ich verwende den JavaScriptSerializer in einer Vielzahl von Szenarien, er hat mich nie im Stich gelassen und ich musste nie nach anderen Lösungen suchen... :)

...aber ich weiß, dass JSON.net hat einige zusätzliche Werte wie LINQ zu JSON, die ich nie benötigt, und schöne JSON-Formatierung, aber als Serialisierung geht JavaScriptSerializer tut die Arbeit gut.

1voto

Lorenzo Punkte 28601

In meinem Fall gibt es verschiedene Gründe, die mich daran hindern, die JavaScriptSerializer . Hier sind einige von ihnen.

1) Unschöne Deserialisierung beim Umgang mit anonymen Typen

Während die Verwendung für die Serialisierung recht einfach ist:

~~JavaScriptSerializer serializer = new JavaScriptSerializer(); String json = serializer.Serialize(data);

Bei der Deserialisierung gibt es jedoch ein kleines Ärgernis, da der Deserialisierer einen generischen Typ zusammen mit dem Inhalt annimmt:

serializer.Deserialize<T>(String s) 

Dies kann ein Problem darstellen, wenn der Typ T zur Kompilierzeit nicht bekannt ist und dynamisch sein muss. Die Umgehung ist ein wenig hässlich, wie ich gelernt habe, weil es Reflexion verwendet, um eine generische Methode zu erstellen (aber es funktioniert)

var result = typeof(JavaScriptSerializer).GetMethod("Deserialize") 
             .MakeGenericMethod(JsonDataType) 
             .Invoke(serializer, new object[] { inputContent });~~ 

Bitte beachten Sie Laut einem Kommentar von Dave Ward zu dieser Antwort gibt es eine DeserializeObject() die zur Verhinderung dieses Problems eingesetzt werden können.

2) Kann nicht mit zirkulären Referenzen umgehen

Ich habe dies gesehen, indem ich Entity Framework , Linq to SQL, NHibernate, NetTiers und sogar bei Verwendung von Burgs Vollmacht .

Según MS Verbinden die Ausnahme für zirkuläre Verweise wird ausgelöst, wenn eine navigierbare Beziehung zweiseitig ist (auf beide Seiten der Beziehung kann zugegriffen werden), so dass zunächst eine Seite der Beziehung deaktiviert werden muss. Die Ausnahme wird auch ausgelöst, wenn Sie 1:1-Beziehungen verwenden (oder 1:0..1 oder jede Beziehung, die die Erstellung einer Eigenschaft vom Typ EntityReference verursacht), in diesem Fall ist die Ausnahme vom Typ System.Data.Metadata.Edm.AssociationType .

Die Lösung hierfür ist, dass der Serializer die Eigenschaften des Typs EntityReference ignoriert, indem er eine leere Implementierung einer von JavaScriptConverter abgeleiteten Klasse verwendet und diese mit der Methode RegisterConverters des JavaScriptSerializer-Objekts registriert.

3) Nützliche Funktionen, die zu weniger testbarem Code führen

Eine nützliche Funktion des JavaScriptSerializer ist, dass Sie auch einen benutzerdefinierten JavaScriptConverter implementieren und diesen an den JavaScriptSerializer übergeben können, um eine feinkörnige Kontrolle über die Serialisierung/Deserialisierung zu erhalten. Damit dies jedoch wirklich nützlich ist, müssen Sie die Typen zur Kompilierungszeit kennen und über Referenzen auf diese Typen verfügen. Dies schränkt die Nützlichkeit dieser Funktion ein, denn durch den Verweis auf diese Klassen wird Ihr Code eng gekoppelt, so dass Sie ihn nicht ohne weiteres in etwas wie einem MVC-Filter verwenden können.

Aus diesen Gründen habe ich oft auf Json.NET zurückgegriffen.

Ich hoffe, das hilft!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X