Ich habe gehört, dass Json.NET schneller als DataContractJsonSerializer ist, und wollte es versuchen ...
Aber ich konnte auf JsonConvert keine Methoden finden, die einen Stream anstelle eines Strings verwenden.
Zum Deserialisieren einer Datei, die JSON auf WinPhone enthält, verwende ich beispielsweise den folgenden Code, um den Dateiinhalt in eine Zeichenfolge zu lesen und dann in JSON zu deserialisieren. In meinen (sehr ad-hoc) Tests scheint es ungefähr viermal langsamer zu sein als mit DataContractJsonSerializer, um direkt aus dem Stream zu deserialisieren ...
// DCJS
DataContractJsonSerializer dc = new DataContractJsonSerializer(typeof(Constants));
Constants constants = (Constants)dc.ReadObject(stream);
// JSON.NET
string json = new StreamReader(stream).ReadToEnd();
Constants constants = JsonConvert.DeserializeObject<Constants>(json);
Mache ich es falsch
quelle
In der aktuellen Version von Json.net können Sie den akzeptierten Antwortcode nicht verwenden. Eine aktuelle Alternative ist:
Dokumentation: Deserialisieren Sie JSON aus einem Dateistream
quelle
stream.Position = 0;
um meinen JSON korrekt zu deserialisieren.quelle
JsonSerializer ser = JsonSerializer.Create(settings);
, können Sie definieren, welche Einstellungen während der De- / Serialisierung verwendet werden sollen.Serialize
Implementierung besteht darin, dass dasStream
übergebene Argument geschlossen wird, was je nach Anwendung ein Problem sein kann. Mit .NET 4.5+ können Sie dieses Problem vermeiden, indem Sie eineStreamWriter
Konstruktorüberladung mit einem Parameter verwendenleaveOpen
, mit dem Sie den Stream offen lassen können.Ich habe eine Erweiterungsklasse geschrieben, die mir beim Deserialisieren aus JSON-Quellen (Zeichenfolge, Stream, Datei) hilft.
Deserialisieren ist jetzt so einfach wie Schreiben:
Hoffe, es wird jemand anderem helfen.
quelle
Using SomeJsonHelpersNamespace
wo dies erforderlich ist, oder entfernen Sie dasthis
Schlüsselwort und verwenden SieJsonHelpers.CreateFromJsonString(someJsonString)
Pro : Es ist so einfacher zu verwenden :)Encoding.Default
ist schlecht, da sie sich auf verschiedenen Computern unterschiedlich verhält (siehe die große Warnung im Microsoft-Dokument). JSON wird voraussichtlich UTF-8 sein, und dies erwartet JsonSerializer. So sollte es seinEncoding.UTF8
. Der Code wie er ist erzeugt verstümmelte Zeichenfolgen oder kann nicht deserialisiert werden, wenn Nicht-ASCII-Zeichen verwendet werden.Ich kam zu dieser Frage und suchte nach einer Möglichkeit, eine offene Liste von Objekten auf eine zu streamen
System.IO.Stream
und sie am anderen Ende abzulesen, ohne die gesamte Liste vor dem Senden zu puffern. (Insbesondere streame ich persistierte Objekte von MongoDB über die Web-API.)@Paul Tyng und @Rivers haben die ursprüngliche Frage hervorragend beantwortet, und ich habe ihre Antworten verwendet, um einen Proof of Concept für mein Problem zu erstellen. Ich habe beschlossen, meine Testkonsolen-App hier zu veröffentlichen, falls jemand anderes mit dem gleichen Problem konfrontiert ist.
Beachten Sie, dass Sie möglicherweise eine Ausnahme erhalten, wenn das
AnonymousPipeServerStream
entsorgt wird. Ich habe dies ignoriert, da es für das vorliegende Problem nicht relevant ist.quelle
{"sign in":{"username":"nick"}}{"buy item":{"_id":"32321123"}}
kann. Dies muss als zwei Fragmente von JSON angesehen werden, die jedes Mal ein Ereignis signalisieren, wenn er ein Fragment liest. In nodejs kann dies in 3 Codezeilen erfolgen.