【发布时间】:2016-05-18 18:58:36
【问题描述】:
我有一个 API 当前接收我推送到文件的 JSON 调用 (800KB-1MB)(每个调用 1 个),并且希望有一个每小时任务,在过去一小时内获取所有 JSON 文件并结合将它们放入一个文件中,以便更好地进行每日/每月分析。
每个文件都由一个数据集合组成,所以格式为 [ object {property: value, ... ]。因此,我不能进行简单的连接,因为它不再是有效的 JSON(也不能添加逗号,那么文件将是集合的集合)。我想尽可能降低内存占用,所以我查看了以下example 并将每个文件推送到流中(使用 JsonConvert.DeserializeObject(fileContent) 反序列化文件;但是,通过这样做,我最终也得到了一个集合的集合。我还尝试使用 JArray 而不是 JsonConvert,将其推送到 foreach 之外的列表,但提供相同的结果。如果我将 Serialize 调用移到 ForEach 之外,它确实有效;但是,我担心在内存中保存 4-6GB 的项目。
总之,我最终得到 [ [ object {property: value, ... ],... [ object {property: value, ... ]] 我想要的输出是 [ object {property :值(file1),...对象{属性:值(fileN)]。
using (FileStream fs = File.Open(@"C:\Users\Public\Documents\combined.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.net