我们正在从HTTP Post请求中消耗大量JSON流。目标是使用JsonTextReader将传入的主体作为JSON流式传输,并将嵌入式base64编码的二进制文件解压缩到磁盘。在XML中,可能是等效的方法 XMLReader.ReadElementContentAsBase64Async。
使用JSON.NET,当我们迭代时,我们如何将encodeImages数组的每个项目发送到FileStream而不将整个字符串保存在内存中。
示例JSON对象:
{
"company":"{clientCompany}",
"batchName":"{clientBatchName}",
"fileType":"{clientFileType}",
"encodedImages":[
"{base64encodedimage}",
"{base64encodedimage}",
"{base64encodedimage}"
],
"customFields":{
"{clientCustomField1}":"{clientCustomValue}",
"{clientCustomField2}":"{clientCustomValue}",
"{clientCustomField3}":"{clientCustomValue}",
"{clientCustomField4}":"{clientCustomValue}"
}
}
答案 0 :(得分:0)
看起来您的问题可以分为两部分:1)如何以内存有效的方式解析和处理JSON,以及2)如何迭代地执行base-64解码
1)内存高效的JSON解析:
假设您可以使用Newtonsoft JSON.net库,JsonReader
类的ReadAsBytes
或ReadAsBytesAsync
方法将成为您最好的朋友,因为它们允许迭代基于流的处理将允许您在JSON解析和处理期间最小化内存占用。为避免为整个文档编写低级解析代码,您可以考虑为示例的JsonConverter
节点编写encodedImages
实现。
2)迭代base-64解码
大多数base-64解码实现完整地解码字符串。支持迭代缓冲解码(由ReadElementContentAsBase64Async
的{{1}}方法支持)需要维护一些状态。深入研究该类的实现,您将找到内部Base64Decoder
类,它正是您所需要的。