J'ai entendu dire que Json.NET est plus rapide que DataContractJsonSerializer, et je voulais l'essayer ...
Mais je n'ai pas trouvé de méthodes sur JsonConvert qui prennent un flux plutôt qu'une chaîne.
Pour désérialiser un fichier contenant JSON sur WinPhone, par exemple, j'utilise le code suivant pour lire le contenu du fichier dans une chaîne, puis désérialiser en JSON. Il semble être environ 4 fois plus lent dans mes tests (très ad hoc) que d'utiliser DataContractJsonSerializer pour désérialiser directement à partir du flux ...
// 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);
Est-ce que je fais mal?
la source
La version actuelle de Json.net ne vous permet pas d'utiliser le code de réponse accepté. Une alternative actuelle est:
Documentation: désérialiser JSON à partir d'un flux de fichiers
la source
stream.Position = 0;
pour désérialiser correctement mon json.la source
JsonSerializer ser = JsonSerializer.Create(settings);
vous pouvez définir les paramètres à utiliser lors de la dés / sérialisation.Serialize
implémentation est qu'elle ferme leStream
passé en tant qu'argument, ce qui, selon l'application, peut être un problème. Avec .NET 4.5+, vous pouvez éviter ce problème en utilisant uneStreamWriter
surcharge de constructeur avec un paramètreleaveOpen
qui vous permet de laisser le flux ouvert.J'ai écrit une classe d'extension pour m'aider à désérialiser des sources JSON (chaîne, flux, fichier).
Désérialiser est désormais aussi simple que d'écrire:
J'espère que cela aidera quelqu'un d'autre.
la source
Using SomeJsonHelpersNamespace
si nécessaire ou supprimez lethis
mot - clé et utilisezJsonHelpers.CreateFromJsonString(someJsonString)
Pro : c'est tellement plus facile à utiliser :)Encoding.Default
est également mauvaise car elle se comportera différemment sur différentes machines (voir le gros avertissement dans le document Microsoft). On s'attend à ce que JSON soit UTF-8 et c'est ce que JsonSerializer attend. Il devrait en être ainsiEncoding.UTF8
. Le code tel quel produira des chaînes déformées ou échouera à désérialiser si des caractères non ASCII sont utilisés.Je suis arrivé à cette question à la recherche d'un moyen de diffuser une liste d'objets ouverte sur un
System.IO.Stream
et de les lire à l'autre extrémité, sans mettre en mémoire tampon la liste entière avant l'envoi. (Plus précisément, je diffuse des objets persistants de MongoDB sur l'API Web.)@Paul Tyng et @Rivers ont fait un excellent travail en répondant à la question initiale, et j'ai utilisé leurs réponses pour construire une preuve de concept pour mon problème. J'ai décidé de publier mon application de console de test ici au cas où quelqu'un d'autre serait confronté au même problème.
Notez que vous pouvez recevoir une exception lorsque le
AnonymousPipeServerStream
est supprimé, j'ai ignoré cela car cela n'est pas pertinent pour le problème en question.la source
{"sign in":{"username":"nick"}}{"buy item":{"_id":"32321123"}}
et il doit voir cela comme deux fragments de JSON signalant un événement à chaque fois qu'il lit un fragment. Dans nodejs, cela peut être fait en 3 lignes de code.