使用JsonTextReader值作为新流传递Base64编码的字符串

时间:2017-10-10 15:56:02

标签: c# json http json.net filestream

我们正在从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}"
    }
}

1 个答案:

答案 0 :(得分:0)

看起来您的问题可以分为两部分:1)如何以内存有效的方式解析和处理JSON,以及2)如何迭代地执行base-64解码

1)内存高效的JSON解析:

假设您可以使用Newtonsoft JSON.net库,JsonReader类的ReadAsBytesReadAsBytesAsync方法将成为您最好的朋友,因为它们允许迭代基于流的处理将允许您在JSON解析和处理期间最小化内存占用。为避免为整个文档编写低级解析代码,您可以考虑为示例的JsonConverter节点编写encodedImages实现。

2)迭代base-64解码

大多数base-64解码实现完整地解码字符串。支持迭代缓冲解码(由ReadElementContentAsBase64Async的{​​{1}}方法支持)需要维护一些状态。深入研究该类的实现,您将找到内部Base64Decoder类,它正是您所需要的。