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

将使用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}" 
    } 
} 
+0

我不这么认为。 [这个问题](https://stackoverflow.com/q/46365304/3744182)从来没有回答,这似乎导致问题#1462 [添加到JsonTextReader#1462二进制数据的缓冲读取](https:// github .com/JamesNK/Newtonsoft.Json/issues/1462)被打开。 – dbc

+0

@dbc看来这个问题是在1小时前提出的,问题在3周前被问到。也许我们的线程结合起来可以提高人们的认识:-) –

+0

你总是可以给问题#1462添加一条评论,表明你也会喜欢这个能力。 – dbc

这似乎是你的问题可以分为两个部分来解决:1)如何分析和在存储有效的方式处理JSON,和2)如何执行碱基64解码反复

1)内存高效的JSON解析:

假设你可以使用Newtonsoft JSON.net图书馆,JsonReader类的ReadAsBytesReadAsBytesAsync方法都将是你最好的FR iends,因为它们允许迭代基于流的处理,这将允许您在JSON解析和处理期间最大限度地减少内存占用。为避免为整个文档编写低级分析代码,您可以考虑为示例的encodedImages节点编写一个JsonConverter实现。

2)迭代基-64解码

大多数碱-64解码的实现解码其全部字符串。支持迭代缓冲解码(作为方法XmlReader的支持)需要维护一些状态。深入了解该课程的实施情况,您会发现内部的Base64Decoder课程正是您所需要的。