На входе имею огромный JSON со сложной структурой. Есть все необходимые классы для десериализации.
Проблема в том, что среди всех полей, массивов, объектов есть свойство Content с Base64 файлом.
В результате размер самого JSON'а может быть около гигабайта. В данный момент я решил проблему путём написания кастомного JSON парсера (JsonStreamFilter), который реализует TextReader:
using (var stream = new FileStream(inFilename, FileMode.Open, FileAccess.Read))
using (var reader = new StreamReader(stream, Encoding.UTF8))
{
using (TextReader filteredStream = new JsonStreamFilter(reader, paths, tempSink))
{
var serializer = new JsonSerializer();
using (var jsonReader = new JsonTextReader(filteredStream))
{
var result = serializer.Deserialize<Dossier>(jsonReader);
}
}
}
JsonStreamFilter на входе получает Stream, Paths -> список путей/ключей (аля root.items[0].registry.Content), которые необходимо offload'ить в Sink.
JsonStreamFilter читает JSON и "передаёт" его JsonTextReader'у, если парсер дошёл до поля которое в списке Paths, то значение этого поля перенаправляется в Sink, а в JsonTextReader передаётся "Guid" полученный от Sink'а.
Всё работает, НО кажется что реализация кастомного парсера медленная... 1GB парсится 2 минуты.
Вопрос: Есть ли быстрый/OOTB парсер .NET, который позволит реализовать тоже самое?
Спасибо.