【问题标题】:Pass Base64 encoded string using JsonTextReader value as new stream使用 JsonTextReader 值将 Base64 编码的字符串作为新流传递
【发布时间】:2017-10-10 15:56:02
【问题描述】:

我们正在使用来自 HTTP Post 请求的大型 JSON 流。目标是使用 JsonTextReader 将传入的正文作为 JSON 流式传输,并将嵌入式 base64 编码的二进制文件提取到磁盘。在 XML 中,等效方法可能是 XMLReader.ReadElementContentAsBase64Async。

使用 JSON.NET,当我们迭代时,我们如何将编码图像数组的每个项目发送到 FileStream 而不将整个字符串保存在内存中。

示例 JSON 对象:

{
    "company":"{clientCompany}",
    "batchName":"{clientBatchName}",
    "fileType":"{clientFileType}",
    "encodedImages":[
        "{base64encodedimage}",
        "{base64encodedimage}",
        "{base64encodedimage}"
    ], 
    "customFields":{
        "{clientCustomField1}":"{clientCustomValue}",
        "{clientCustomField2}":"{clientCustomValue}",
        "{clientCustomField3}":"{clientCustomValue}",
        "{clientCustomField4}":"{clientCustomValue}"
    }
}

【问题讨论】:

  • 我不这么认为。 this question 从未得到答复,这似乎导致问题 #1462 Add buffered reading of binary data to JsonTextReader #1462 被打开。
  • @dbc 似乎该问题是在 1 小时前提出的,并且该问题是在 3 周前提出的。也许我们的线程结合起来会提高认识:-)
  • 您可以随时在问题 #1462 中添加评论,表明您也想要该功能。

标签: c# json http json.net filestream


【解决方案1】:

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

1) 内存高效的 JSON 解析:

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

2) 迭代 base-64 解码

大多数 base-64 解码实现对字符串进行整体解码。支持迭代缓冲解码(由XmlReaderReadElementContentAsBase64Async 方法支持)需要维护一些状态。深入研究该类的实现,您会发现内部的 Base64Decoder 类正是您需要的。

【讨论】:

  • JsonReader.ReadAsBytes[Async]() 将整个值读入字节数组。 JsonConverter 几乎相同。问题是:“我们如何将encodedImages 数组的每个项目 发送到FileStream 而不将整个字符串保存在内存中”。
猜你喜欢
  • 2010-11-25
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多