Ouvi dizer que o Json.NET é mais rápido que o DataContractJsonSerializer e queria experimentá-lo ...
Mas não consegui encontrar nenhum método no JsonConvert que aceite um fluxo em vez de uma string.
Para desserializar um arquivo que contém JSON no WinPhone, por exemplo, eu uso o código a seguir para ler o conteúdo do arquivo em uma sequência e depois desserializar para JSON. Parece ser cerca de 4 vezes mais lento nos meus testes (muito ad-hoc) do que usar o DataContractJsonSerializer para desserializar diretamente do fluxo ...
// 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);
Estou fazendo errado?
fonte
A versão atual do Json.net não permite que você use o código de resposta aceito. Uma alternativa atual é:
Documentação: Desserialize JSON de um fluxo de arquivos
fonte
stream.Position = 0;
para desserializar corretamente meu json.fonte
JsonSerializer ser = JsonSerializer.Create(settings);
poderá definir quais configurações usar durante a des serialização.Serialize
implementação é que ela fecha oStream
passado como argumento, o que, dependendo do aplicativo, pode ser um problema. Com o .NET 4.5+, você pode evitar esse problema usando umaStreamWriter
sobrecarga de construtor com um parâmetroleaveOpen
que permite deixar o fluxo aberto.Eu escrevi uma classe de extensão para me ajudar a desserializar de fontes JSON (string, stream, arquivo).
Desserializar agora é tão fácil quanto escrever:
Espero que ajude alguém.
fonte
Using SomeJsonHelpersNamespace
quando necessário ou remover athis
palavra-chave e usarJsonHelpers.CreateFromJsonString(someJsonString)
Pro : é tão fácil de usar :)Encoding.Default
é ruim, pois se comportará de maneira diferente em máquinas diferentes (consulte o grande aviso no documento da Microsoft). O JSON deve ser UTF-8 e é isso que o JsonSerializer espera. Assim deveria serEncoding.UTF8
. O código como está produzirá cadeias ilegíveis ou falhará na desserialização se forem usados caracteres não ASCII.Cheguei a essa pergunta procurando uma maneira de transmitir uma lista de objetos abertos para um
System.IO.Stream
e lê-los do outro lado, sem armazenar a lista inteira antes de enviá-los. (Especificamente, estou transmitindo objetos persistentes do MongoDB pela API da Web.)@Paul Tyng e @Rivers fizeram um excelente trabalho respondendo à pergunta original, e eu usei as respostas deles para criar uma prova de conceito para o meu problema. Decidi postar meu aplicativo de console de teste aqui, caso mais alguém esteja enfrentando o mesmo problema.
Observe que você pode receber uma exceção quando o
AnonymousPipeServerStream
item for descartado. Eu ignorei isso, pois não é relevante para o problema em questão.fonte
{"sign in":{"username":"nick"}}{"buy item":{"_id":"32321123"}}
e precisa ver isso como dois fragmentos de JSON sinalizando um evento cada vez que ele lê um fragmento. No nodejs, isso pode ser feito em 3 linhas de código.