编写换行符分隔的 Json

Posted

技术标签:

【中文标题】编写换行符分隔的 Json【英文标题】:Writing Newline Delimited Json 【发布时间】:2016-07-08 13:12:32 【问题描述】:

我正在研究如何使用 Json.Net 编写新行分隔的 JSON。我需要这样做才能将数据导出到 Google BigQuery - https://cloud.google.com/bigquery/data-formats#json_format

目前我发现的唯一方法是循环遍历我的集合并一次序列化每个对象,但我想知道是否有更好的方法。

我遇到了这个previous question,但答案只解释了如何读取换行符分隔的 Json,而不是如何编写它

【问题讨论】:

如果您有当前可以运行的代码,那么您要问什么?您希望帮助解决的具体问题是什么? @dbc 因为我想知道是否有更好的方法。而不是循环我的 List 集合,我想知道是否有办法将我的集合传递给 Json 序列化程序,它可以按照我需要的方式格式化 json。 @JonClarke 好奇您是否能够将 List 格式化/保存为新行分隔的 JSON?目前,我们也在做同样的事情——将每个循环和序列化为一个 C# 对象。 @projectzerotohero 是的,我还在用同样的方法,我还没有找到更好的方法 【参考方案1】:

没有换行符分隔的 JSON 这样的东西。您要问的是将 JSON 对象存储在单独的单独行中。这被许多大数据和事件处理产品使用,包括 Azure Stream Analytics、Hive、Google 的 Big Query 等。

使用这种存储方法是因为它使并行处理很多变得更容易:

读取时,可以轻松地按行对单个文件进行分区,而无需实际解析整个文本,并将其分配给不同的线程或工作人员。 可以独立处理行,无需等待解析整个文本。这使您可以利用例如异步操作和/或数据流来同时读取和解析 写入时,多个线程可以将数据写入不同的文件,然后可以将所有文件合并到一个文件中。即使您写入单个磁盘,操作系统和磁盘缓冲以及操作开销也意味着并发发送 X 操作可以比顺序执行 X 操作更快地完成。 每个工作线程/线程都可以直接写入一条新记录。解析器需要访问所有记录才能生成文件。

因此,使用解析器生成此类文件不是一个好主意,即使解析器支持它。单线程实现太慢了,并且会迫使您在写出之前收集所有记录。

为了提高性能,您可以写入多个文件,最好是在单独的磁盘上,最后将所有文件合并为一个。您还可以在每条记录生成时写入它,而不是在写出它们之前等待将它们全部加载到内存中。

【讨论】:

有一种格式叫做完全换行分隔的 JSON:ndjson.org @Koterpillar 不,这只是给 not JSON 的东西的非正式名称。它是由换行符分隔的 JSON 片段,用于上述原因。您链接到的 Github 存储库是在人们开始使用换行符之后很久创建的。提到的唯一库是作者自己的,从未更新过。那不是格式的网站,那是失败的公关噱头 @Koterpillar 和合法的“规范”基本上是无用的。它只是与实际标准的链接。它所说的只是“使用换行符作为分隔符”。但这不是使用的。 不应使用换行符,除非用于分隔整个记录。 它可能不是 IETF 标准,也可能没有大量追随者,但它确实存在。看起来至少有几个库是由不同的人编写的。我们在生产中使用其中一个,它很稳定。 @Koterpillar 相反,这种特殊格式非常常见,被许多云和物联网产品使用,并得到许多库的支持。它根本与该站点无关,其唯一目的似乎是域名抢注。就像专利一样。您不能声称提出人们已经在使用的标准

以上是关于编写换行符分隔的 Json的主要内容,如果未能解决你的问题,请参考以下文章

将逗号分隔的 JSON 转换为换行符分隔的节点

在 Python 中将 JSON 转换为换行符分隔的 JSON

如何使用改造和 moshi 解析换行符分隔的 JSON?

如何通过node.js中的JSONStream模块解析一个大的、换行符分隔的JSON文件?

使用php将json api结果以换行符分隔格式保存到json文件

将 Pandas DataFrame 写入换行符分隔的 JSON