【问题标题】:How to read json payload of a large response?如何读取大型响应的 json 有效负载?
【发布时间】:2019-10-17 07:51:41
【问题描述】:

我正在开发一些代码来读取 Mailchimp 的导出 API 返回的大型 json 有效负载。

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

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

我目前正在使用 Visual Studio 2017 调试器尝试查看响应,但我不断收到一条错误消息:

由于没有足够的可用内存,无法获取局部变量或参数的值。

我最终想从这个 json 数据的每一“行”中提取信息并对它们进行操作。我需要怎么做才能在不耗尽内存的情况下查看这些数据?

【问题讨论】:

  • “大”到底有多大?
  • 转储到文件中。

标签: c# json mailchimp dotnet-httpclient


【解决方案1】:

操作大型 JSON 文件的一般方法:

我会首先避免尝试解码为字符串。相反,请按照in my answer here 的描述获取响应的内容流,以避免在您动手之前将整个流下载到内存中。

现在你可以:

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

获取Stream 而不是string

现在你可以根据here的信息将流直接送入反序列化器:

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

如果您仍然对内存感到窒息,您可能需要考虑使用JsonTextReader 在较低级别进行操作

【讨论】:

    【解决方案2】:

    试试

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

    还要确保你的方法是异步的

    public async Task<returntype> MethodName()
    

    让 ReadAsAsync 中的“model”成为您要将数据映射到的对象模型的名称,并让方法名称中 Task 旁边的“returntype”成为您的方法返回的任何数据类型

    您能否更新您的问题并显示整个方法。我想仔细看看

    【讨论】:

      猜你喜欢
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 2020-03-24
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      相关资源
      最近更新 更多