【问题标题】:Combine Multiple JSON Files Json.NET合并多个 JSON 文件 Json.NET
【发布时间】: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


    【解决方案1】:

    在这种情况下,为了保持您的处理和内存占用较低,我想我会一个接一个地连接文件,即使它会导致技术上无效的 JSON。要稍后反序列化组合文件,您可以利用 SupportMultipleContent 类上的 SupportMultipleContent 设置,并通过流处理对象集合,就好像它们是一个完整的集合一样。有关如何执行此操作的示例,请参阅 this answer

    【讨论】:

    • 这看起来正是我所需要的 - 我很惊讶这个问题是如此普遍,以至于他们实际上做了那个设置!谢谢。
    • 我第一次接触的时候也很惊讶,但它已经派上用场不止一次了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    相关资源
    最近更新 更多