Я предлагаю вам 3 пути, начиная с наименее эффективного, но с наименьшим кодом.
десериализация в объект JO непосредственно из Stream
Это позволяет избежать сначала преобразуя все данные в строку. Таким образом, вы экономите место в памяти для строки.
var serializer = new JsonSerializer();
using (var textReader = new StreamReader(stream))
using (var jsonReader = new JsonTextReader(textReader))
{
var jobject = (JObject)serializer.Deserialize(jsonReader);
}
Десериализуйте в класс C#, затем создайте нужный вам класс. JObject имеет больший вес, чем POCO, и потребляет больше памяти.
Это просто. Предположим, что созданный вами класс Data
.
var serializer = new JsonSerializer();
using (var textReader = new StreamReader(stream))
using (var jsonReader = new JsonTextReader(textReader))
{
var data = serializer.Deserialize<Data>(jsonReader);
}
Используйте JsonTextReader
для непосредственного считывания в целевую структуру данных
Это предполагает ручное считывание свойств и значений вашего потока json в структуру тебе нужно. Это экономит пространство памяти любых промежуточных объектов (точнее, любые промежуточные объекты будут содержать только текущий токен, который вы читаете, а не все данные). Если вы вернете IEnumerable<(IClass1, IClass2)>
, пользователь вашего метода может фактически обработать результат в потоковом режиме, сделав это алгоритмом online .
Я оставлю вас копаться в документации, чтобы узнайте, как его использовать:)