Задать вопрос

Как заменить значение свойства в JSON'е во время десериализации без загрузки в память?

На входе имею огромный 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, который позволит реализовать тоже самое?

Спасибо.
  • Вопрос задан
  • 144 просмотра
Подписаться 2 Средний 4 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы