app开发者平台在数字化时代的重要性与发展趋势解析
1114
2022-08-30
C# 中使用HttpClient读取大型json数据集
问题:如何使用HTTP读取大型JSON数据?
在工作中我们经常需要调用api获取数据,这些数据大多数情况下都小型的,比如分页获取数据等。通常不使用HTTP方式传输大型数据。
然而再最近的一工作中,需要调用[Salesforce] 的api传输数据,经过测试发现这个api返回巨量数据,大约50k+,一次性存储和反序列化这没多的JSON数据是不可可能的。
方法1:使用传统一次性读并反序列化。
所以最快能想到的方法是使用api提供的filter条件减少每次加载的数据大小,然后分批加载他们。示例代码如下:(为了演示代码做了简化)
public class Main{ public async void Main() { string year="FY22"; //按年度 string accountIds = "123,124"; //按客户Id var data = await LoadApiData(); JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.DeserializeObject(data);//这是一个老式的方法(新方法使用String.Text.Json),仅用于演示目的。这个反序列化过程如果返回的JSON数据特别大,会超过长度限制而报错,同时占用内存非常高。
} public async Task
但最后发现数据量依然很大,这种方法再Javascript反序列化时候会导致超过最大长度限制,内存占用大,最终导致运行失败。后来尝试使用更更多的filter去减少返回的数据量,但发现如果这样写,太多的参数导致程序的可维护性会变差,同时你也不能保证返回的数据量是否依然超过限制。
经过研究Salesforce的api发现,他们使用了HTTP协议中的流式传输,以分块传输的大型Json数据。返回的HTTP头部包含Transfer-Encoding:chunk。
这样一来,我们也可以使用HttpClient的流式处理方式来处理返回的数据了,避免了之前的问题,内存占用量也会大大减少。
方法2:使用流式分块读取
//该方法使用了C# 8.0的 IAsyncEnumerable 异步流接口,后面有机会再跟大家解释这个强大的功能。//这里的作用就是为了异步返回流式读取到的JSON数据。public async IAsyncEnumerable
总结
我们通常只认为HTTP之传输少量的数据,但是HTTP 1.1规范中定了可以使用Transfer-Encoding:chunk的方式分块传输大量数据。
所以再需要传输大量数据的情况下(尤其是做上下游系统数据集成分析类应用时)可以使用HTTP流式传输,并流式加载和处理他们。好处是占用内存资源大大减少,并可以处理大量数据传输。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~