有没有办法将 json 对象转换为 json l 文件
Posted
技术标签:
【中文标题】有没有办法将 json 对象转换为 json l 文件【英文标题】:is there a way to convert a json object to json l file 【发布时间】:2020-09-18 06:06:55 【问题描述】:我有一个对象数组。我需要将其转换为 .jsonl 格式并使用 lambda 函数中的节点将其作为响应发送 我一直在尝试将其更改为字符串并添加 '\n' 以使其成为新行,但它不起作用
【问题讨论】:
您能发布示例数据和预期格式吗? 请澄清。您可以将 JSON 格式的对象数组全部放在一行上,这是一个有效的单记录 JSONL 文件。如果您希望数组的每个项目成为单独的行/记录,只需将每个元素单独转换为字符串,然后将结果字符串与换行符连接在一起。 npmjs.com/package/jsonlines 您可能应该将其发布为答案而不是评论,@user120242。 【参考方案1】:生成 jsonlines 的简单代码。 jsonlines 实际上只是一堆单行 JSON 对象,它们被字符串化并在它们之间用换行符连接。就是这样。 您需要处理的另一个问题是转义 unicode,因此当您写入文件时,必须使用 UTF-8 编码。
使用 jsonlines npm 库的 repl.it 演示:https://repl.it/repls/AngelicGratefulMoto
简单的纯 JS 演示:
data = [ jsonlines: 'is awesome' , jsonlines: 'is awesome' , jsonlines: 'is awesome' , jsonlines: 'is awesome' , jsonlines: 'is awesome' ]
console.log(
data.map(x=>JSON.stringify(x)).join('\n')
)
【讨论】:
链接 replit.com/repls/AngelicGratefulMoto 是使用 jsonlines npm 库的 repl.it 演示已失效【参考方案2】:解决从.json
到.jsonl
的大量数据转换问题的方法:
由于数据中存在、
、
[
、]
,在实施@user120242 的答案之前进行猴子修补试验失败
const sampleData = [ jsonlines: 'is awesome' , jsonlines: 'is awesome' , jsonlines: 'is awesome' , jsonlines: 'is awesome' , jsonlines: 'is awesome' ]
console.log(JSON.stringify(sampleData).replace('[', '').replace(']', '').replaceAll(',', '\n'));
@user120242
的答案适用于较小的数据(我想要一个尽可能不使用任何外部库或包的解决方案),并且确实是一个干净的解决方案,它对我的 ~100 MB
的数据有效@ 987654344@,除此之外它失败了(我的解决方案在Docker version 20.10.5, build 55c4c88
中使用DockerOperator
在airflow v2.0.1
中执行~100 MB
的~100 MB
的array of objects
的数据,并且它对于数据中的数据非常失败~750 MB
的范围 array of objects
与此问题 - JSON.stringify throws RangeError: Invalid string length for huge objects)
将.json
转换为.jsonl
的与https://dev.to/madhunimmo/json-stringify-rangeerror-invalid-string-length-3977 类似的解决方案的跟踪与上述相同的问题不起作用 - JSON.stringify throws RangeError: Invalid string length for huge objects
从@Bergi
's answer 实现for...of
- Using async/await with a forEach loop 取得了出色的性能(我的实现在node.js v14.1.0
中工作,由Docker version 20.10.5, build 55c4c88
在airflow v2.0.1
中使用DockerOperator
执行,直到数据为~750 MB
array of objects
)
const fsPromises = require('fs').promises;
const writeToFile = async () =>
const dataArray = [ jsonlines: 'is awesome' , jsonlines: 'is awesome' , jsonlines: 'is awesome' , jsonlines: 'is awesome' , jsonlines: 'is awesome' ];
for (const dataObject of dataArray)
await fsPromises.appendFile( "out.jsonl" , JSON.stringify(dataObject) + "\n");
附: :如果您还没有为node.js v14.1.0
提供超出默认值的额外内存,您将面临Node JS Process out of memory 更大的数据(通常是>100 MB
),以下为Dockerfile
中的使用制定了以下内容(将6144
替换为MB
中要分配的内存量)
CMD node --max-old-space-size=6144 app.js
【讨论】:
以上是关于有没有办法将 json 对象转换为 json l 文件的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法让 PHP 将 sql 结果直接转换为 JSON?
使用 Moshi 将字符串日期从 json 转换为 Date 对象