将使用JsonTextReader值的Base64编码字符串传递为新流
问题描述:
我们正在使用来自HTTP Post请求的大型JSON流。目标是使用JsonTextReader将传入的主体以JSON流式传输,并将嵌入式base64编码的二进制文件提取到磁盘。在XML中,等效方法可能是 XMLReader.ReadElementContentAsBase64Async。将使用JsonTextReader值的Base64编码字符串传递为新流
使用JSON.NET,当我们迭代时,我们如何将encodedImages数组的每个项目发送到FileStream中,而无需在内存中保存整个字符串。
例JSON对象:
{
"company":"{clientCompany}",
"batchName":"{clientBatchName}",
"fileType":"{clientFileType}",
"encodedImages":[
"{base64encodedimage}",
"{base64encodedimage}",
"{base64encodedimage}"
],
"customFields":{
"{clientCustomField1}":"{clientCustomValue}",
"{clientCustomField2}":"{clientCustomValue}",
"{clientCustomField3}":"{clientCustomValue}",
"{clientCustomField4}":"{clientCustomValue}"
}
}
答
这似乎是你的问题可以分为两个部分来解决:1)如何分析和在存储有效的方式处理JSON,和2)如何执行碱基64解码反复
1)内存高效的JSON解析:
假设你可以使用Newtonsoft JSON.net图书馆,JsonReader
类的ReadAsBytes
或ReadAsBytesAsync
方法都将是你最好的FR iends,因为它们允许迭代基于流的处理,这将允许您在JSON解析和处理期间最大限度地减少内存占用。为避免为整个文档编写低级分析代码,您可以考虑为示例的encodedImages
节点编写一个JsonConverter
实现。
2)迭代基-64解码
大多数碱-64解码的实现解码其全部字符串。支持迭代缓冲解码(作为方法XmlReader
的支持)需要维护一些状态。深入了解该课程的实施情况,您会发现内部的Base64Decoder
课程正是您所需要的。
我不这么认为。 [这个问题](https://stackoverflow.com/q/46365304/3744182)从来没有回答,这似乎导致问题#1462 [添加到JsonTextReader#1462二进制数据的缓冲读取](https:// github .com/JamesNK/Newtonsoft.Json/issues/1462)被打开。 – dbc
@dbc看来这个问题是在1小时前提出的,问题在3周前被问到。也许我们的线程结合起来可以提高人们的认识:-) –
你总是可以给问题#1462添加一条评论,表明你也会喜欢这个能力。 – dbc