将多个 JSON 对象记录到单个文件 - 文件格式

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

我有一个解决方案,我需要能够将多个 JSON 对象记录到一个文件中。本质上是每天制作一个日志文件。从单个文件写入(然后读取)这些内容的最简单方法是什么?

MongoDB 如何使用 BSON 处理这个问题?它用什么作为“记录”之间的分隔符?

Protocol Buffers、BSON、MessagePack 等是否提供压缩和记录概念?压缩将是一个很好的好处。

json logging protocol-buffers bson messagepack
2个回答
0
投票

使用协议缓冲区,您可以按如下方式定义消息:

Message JSONObject {
    required string JSON = 1;
}

Message DailyJSONLog {
  repeated JSONObject JSON = 1;
}

这样您只需从内存中读取文件并将其反序列化。序列化它们的方式本质上也是相同的。将文件(序列化的

DailyJSONLog
)保存到磁盘上后,您可以轻松地将序列化的
JSONObject
附加到该文件的末尾(因为
DailyJSONLog
消息非常简单,是一个重复字段)。

唯一的问题是,如果您每天有很多消息,或者您想在一天中的某个位置开始(您无法轻松到达重复列表的中间(或任意)) 。

我通过使用

JSONObject
、序列化它然后对其进行 Base64 编码来解决这个问题。我将它们存储到一个由新行分隔的文件中。这使您可以非常轻松地查看每个文件中有多少条记录,访问文件中的任意 JSON 对象,并轻松地继续扩展文件(您也可以非常简单地扩展上面的“重复”消息,但它是一个一种简单的操作方式...)

压缩是另一个主题。 Protocol Buffers 不会压缩字符串。如果您要定义一个 pb 消息来匹配您的 JSON 消息,那么您将受益于让 pb 可能将任何整数“压缩”为其

[varint][1]
编码格式。如果您也尝试上述 base64 编码路线,您将获得“更少”的压缩。


0
投票

我自己是 JSON 新手,也有同样的问题。我一直很难理解为什么 JSON 对象/消息被称为“文件”。对我来说,文件是存储在某种存储介质上的东西,而不是以大括号开头和结尾的格式化字符串。关键是,事实上 JSON 对象通常被称为“文件”,这使得寻找如何在磁盘上的文件中存储多个 JSON“文件”的答案变得复杂。

幸运的是,我遇到了NDJSON,即换行符分隔的JSON。它本质上是一个 JSON 对象,作为单行写入磁盘上基于文本的文件,后跟换行符和可选的回车符。它被记录在here

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