将多个 JSON 文件读入内存流

问题描述 投票:0回答:1

我有一些 C# 代码,可以将 .gz 文件(包含 1 个 .json 文件)的内容读取到内存流中,并找到“[”的第一个实例,然后获取数据。但是,根据我发送的创建 gz 响应的数据量,它可能包含超过 1 个 .json 文件。 我如何更改我的代码,以便它删除标头和任何后续 JSON 文件“启动器”,或者(可能是更好的选择)依次将每个文件读取到内存流中并获取所需的数据?

当前代码片段是

string responseBodyUrl = getResponseObject.response_body_url;

// get the tar.gr file and expand
WebClient webClient = new WebClient();
Stream stream = webClient.OpenRead(responseBodyUrl);
MemoryStream memoryStream = new MemoryStream();
GZipStream gzipStream = new GZipStream(stream, CompressionMode.Decompress);
gzipStream.CopyTo(memoryStream);
gzipStream.Close();
stream.Close();
memoryStream.Position = 0;
StreamReader reader = new StreamReader(memoryStream);
string memstreamjson = reader.ReadToEnd();
reader.Close();
memoryStream.Close();

// find the index of the first '[' character
int index = memstreamjson.IndexOf('[');
                                  System.IO.File.AppendAllText(@"memstreamjson.log",memstreamjson.ToString().TrimEnd() + Environment.NewLine);

// if found
if (index != -1)
 {
  // get the substring from that index to the end
  string indexedmemstreamjson = memstreamjson.Substring(index);

  // parse the JSON string as an array
  JArray arr = JArray.Parse(indexedmemstreamjson.ToString());
  
  // loop through each element of the array
  foreach (JObject obj in arr)
   {
    // get the status_code value of the JObject
    string status_code = (string)obj["status_code"];
etc

gz 文件输入(多个 (2) 个文件)如下所示:

./                                                                                                  0000755 0000000 0000000 00000000000 14512730710 007711  5                                                                                                    ustar   root                            root                                                                                                                                                                                                                   ./0q6hnae8uz.json                                                                                   0000666 0000000 0000000 00016772531 14512730710 012547  0                                                                                                    ustar   root                            root                                                                                                                                                                                                                   [{"status_code":200,"operation_id":null,"response":"{\"id\":\"19159244156b70211d3e26b64ce38fc2\",\"email_address\":\"[email protected]\"}]                                                                                                                                                                       ./46kbba2abt.json                                                                                   0000666 0000000 0000000 00000007550 14512730710 012441  0                                                                                                    ustar   root                            root                                                                                                                                                                                                                   [{"status_code":200,"operation_id":null,"response":"{\"id\":\"0ec0b4c07a27c60069735d321875fa78\",\"email_address\":\"sammy:sammymail.com\"}] 

提前非常感谢

尝试了上面的代码,当 gz 中只有一个 JSON 文件时可以找到,但当有多个时则失败。 我期望获得每个 JSON 文件的开头,然后将读取行内容读取到控制台。

c# mailchimp-api-v3.0
1个回答
0
投票

我建议使用 zipArchive 而不是 gzip 流来存储多个 json 文件。

普通的 json 文件不能包含多个根节点。存储多个独立数据 blob 的相当标准的方法是将每个数据 blob 转换为二进制,然后将它们按顺序存储到带有长度前缀的流中。但是像 zip 或 tar 存档 这样的格式提供了许多相同的优点,可以在大多数平台上轻松使用,并且具有与标准工具兼容的优点,所以这就是我会选择的格式。

tar+gzip 与 zip-archive 主要取决于偏好。 Zip 在 Windows 系统上更常见,而我相信 tar+gzip 在 Linux 上更常见。

© www.soinside.com 2019 - 2024. All rights reserved.