我有一个 API 当前接收我推送到文件 (800KB-1MB( 的 JSON 调用(每个调用 1 个(,并且希望有一个每小时的任务,该任务获取过去一小时内的所有 JSON 文件并将它们合并到一个文件中,以便更好地进行每日/每月分析。
每个文件都由一组数据组成,因此采用 [ 对象 {属性: 值, ...] 的格式。 因此,我无法进行简单的串联,因为它将不再是有效的 JSON(也不添加逗号,然后文件将是集合的集合(。 我想保持尽可能低的内存占用,所以我正在查看以下示例,并将每个文件推送到流中(使用 JsonConvert.DeserializeObject(fileContent( 反序列化文件;但是,通过这样做,我最终也会得到一个集合集合。 我也尝试使用 JArray 而不是 JsonConvert,推送到 foreach 之外的列表,但提供相同的结果。 如果我将序列化调用移到 ForEach 之外,它确实有效;但是,我担心在内存中保留4-6GB的项目。
总之,我最终得到 [ [ 对象 {属性: 值, ... ],...[ 对象 {属性: 值, ... ]]其中我想要的输出是 [ 对象 {属性: 值 (文件1(, ...对象 {属性: 值 (文件N( ]。
using (FileStream fs = File.Open(@"C:UsersPublicDocumentscombined.json", FileMode.CreateNew))
{
using (StreamWriter sw = new StreamWriter(fs))
{
using (JsonWriter jw = new JsonTextWriter(sw))
{
jw.Formatting = Formatting.None;
JArray list = new JArray();
JsonSerializer serializer = new JsonSerializer();
foreach (IListBlobItem blob in blobContainer.ListBlobs(prefix: "SharePointBlobs/"))
{
if (blob.GetType() == typeof(CloudBlockBlob))
{
var blockBlob = (CloudBlockBlob)blob;
var content = blockBlob.DownloadText();
var deserialized = JArray.Parse(content);
//deserialized = JsonConvert.DeserializeObject(content);
list.Merge(deserialized);
serializer.Serialize(jw, list);
}
else
{
Console.WriteLine("Non-Block-Blob: " + blob.StorageUri);
}
}
}
}
}
在这种情况下,为了保持较低的处理和内存占用,我想我会一个接一个地连接文件,即使它会导致技术上无效的 JSON。 若要稍后反序列化组合文件,可以利用 JsonTextReader
类上的 SupportMultipleContent
设置,并通过流处理对象集合,就好像它们是整个集合一样。 有关如何执行此操作的示例,请参阅此答案。