Как прочитать полезную нагрузку JSON большого ответа? - PullRequest
1 голос
/ 31 мая 2019

Я разрабатываю некоторый код, который будет читать большую полезную нагрузку json, возвращенную API экспорта Mailchimp.

        var response = caller.PostAsync(endpoint, data).Result;

        var exportedData = response.Content.ReadAsStringAsync().Result;

В настоящее время я использую отладчик Visual Studio 2017, чтобы попытаться просмотреть ответ, но я продолжаюпоявляется сообщение об ошибке:

Невозможно получить значение локальной переменной или аргумента, поскольку недостаточно памяти.

В конечном итоге я хочу извлечь информацию из каждого 'ряд 'этих данных JSON и делать операции над ними.Что мне нужно сделать, чтобы я мог просматривать эти данные без нехватки памяти?

Ответы [ 2 ]

2 голосов
/ 31 мая 2019

Общий подход к работе с большими файлами JSON:

Я бы начал с того, что избегал любых попыток декодирования в строку.Вместо этого возьмите поток контента вашего ответа, следуя тому, что описано в моем ответе здесь , чтобы избежать загрузки всего потока в память, прежде чем вы получите его.

Теперь вы можете:

var stream = await response.Content.ReadAsStreamAsync();

для захвата Stream вместо string.

Теперь вы можете подавать поток непосредственно в десериализатор, согласно информации здесь :

using (StreamReader sr = new StreamReader(stream))
using (JsonReader reader = new JsonTextReader(sr))
{
    JsonSerializer serializer = new JsonSerializer();
    var o = serializer.Deserialize<SomeClassMatchingTheJsonSchema>(reader);
}

Если вы все еще задыхаетесь от памяти, вам может потребоваться работа на более низком уровне, используя JsonTextReader

0 голосов
/ 31 мая 2019

try

var exportedData = await response.Content.ReadAsAsync<model>();

также убедитесь, что ваш метод асинхронный

public async Task<returntype> MethodName()

Пусть "model" в ReadAsAsync будет именем объектной модели, которую вы собираетесь отобразитьданные и пусть "returntype", рядом с Task в имени метода, будут теми типами данных, которые ваш метод возвращает

, можете ли вы обновить свой вопрос и показать весь метод.Я хотел бы поближе взглянуть на это

...