Qual è il modo corretto di utilizzare JSON.NET per analizzare il stream di oggetti JSON?

Ho un stream di oggetti JSON che assomiglia un po ‘a questo:

{...}{...}{...}{...}... 

Quindi praticamente un elenco concatenato di oggetti JSON senza alcun separatore. Qual è il modo corretto per deserializzare quelli in un IEnumerable utilizzando JSON.NET? Al momento ho provato qualcosa di simile

 var serializer = new JsonSerializer(); serializer.CheckAdditionalContent = false; using (var reader = new StreamReader(stream)) using (var jsonReader = new JsonTextReader(reader)) { reader.SupportMultipleContent = true; reader.Read(); while (reader.TokenType != JsonToken.None) { yield return serializer.Deserialize(reader); } } 

Ma questo fallisce con

 Newtonsoft.Json.JsonSerializationException: Unexpected token while deserializing object: EndObject. Path '', line 1, position 55. at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) at Newtonsoft.Json.JsonSerializer.Deserialize[T](JsonReader reader) 

Ovviamente ho bisogno di spostare il lettore dopo la chiamata Deserialize , ma come faccio a fare questo?

Penso che se cambi leggermente il tuo loop tutto dovrebbe funzionare:

 public IEnumerable ReadJson(Stream stream) { var serializer = new JsonSerializer(); using (var reader = new StreamReader(stream)) using (var jsonReader = new JsonTextReader(reader)) { jsonReader.SupportMultipleContent = true; while (jsonReader.Read()) { yield return serializer.Deserialize(jsonReader); } } } 

Si noti che è necessario eseguire l’iterazione su IEnumerable mentre il Stream trasmesso a questo metodo è aperto:

 using (var stream = /* some stream */) { IEnumerable result = ReadJson(stream); foreach (var item in result) { Console.WriteLine(item.MyProperty); } } 

Esempio: https://dotnetfiddle.net/Y2FLuK