He oído que Json.NET es más rápido que DataContractJsonSerializer, y quería probarlo ...
Pero no pude encontrar ningún método en JsonConvert que tome una secuencia en lugar de una cadena.
Para deserializar un archivo que contiene JSON en WinPhone, por ejemplo, utilizo el siguiente código para leer el contenido del archivo en una cadena y luego deserializarlo en JSON. Parece ser aproximadamente 4 veces más lento en mis pruebas (muy ad-hoc) que usar DataContractJsonSerializer para deserializar directamente de la transmisión ...
// 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);
¿Lo estoy haciendo mal?
fuente
La versión actual de Json.net no le permite usar el código de respuesta aceptado. Una alternativa actual es:
Documentación: Deserializar JSON de una secuencia de archivos
fuente
stream.Position = 0;
para deserializar correctamente mi json.fuente
JsonSerializer ser = JsonSerializer.Create(settings);
, puede definir qué configuraciones usar durante la des / serialización.Serialize
implementación es que cierra elStream
paso como argumento, lo que dependiendo de la aplicación puede ser un problema. Con .NET 4.5+ puede evitar este problema utilizando unaStreamWriter
sobrecarga del constructor con un parámetroleaveOpen
que le permita dejar abierta la secuencia.He escrito una clase de extensión para ayudarme a deserializar desde fuentes JSON (cadena, secuencia, archivo).
Deserializar ahora es tan fácil como escribir:
Espero que ayude a alguien más.
fuente
Using SomeJsonHelpersNamespace
donde sea necesario o elimine lathis
palabra clave y useJsonHelpers.CreateFromJsonString(someJsonString)
Pro : es tan fácil de usar :)Encoding.Default
es malo, ya que se comportará de manera diferente en diferentes máquinas (consulte la gran advertencia en el documento de Microsoft). Se espera que JSON sea UTF-8 y esto es lo que JsonSerializer espera. Así debería serEncoding.UTF8
. El código tal cual producirá cadenas ilegibles o no se deserializará si se utilizan caracteres no ASCII.Llegué a esta pregunta en busca de una forma de transmitir una lista abierta de objetos en un
System.IO.Stream
y leerlos desde el otro extremo, sin almacenar la lista completa antes de enviarlos. (Específicamente, estoy transmitiendo objetos persistentes de MongoDB a través de la API web).@Paul Tyng y @Rivers hicieron un excelente trabajo respondiendo la pregunta original, y usé sus respuestas para crear una prueba de concepto para mi problema. Decidí publicar mi aplicación de consola de prueba aquí en caso de que alguien más esté enfrentando el mismo problema.
Tenga en cuenta que puede recibir una excepción cuando
AnonymousPipeServerStream
se elimine, lo ignoré ya que no es relevante para el problema en cuestión.fuente
{"sign in":{"username":"nick"}}{"buy item":{"_id":"32321123"}}
y necesita ver esto como dos fragmentos de JSON que señalan un evento cada vez que lee un fragmento. En nodejs esto se puede hacer en 3 líneas de código.