有没有一种方法可以将JSON对象转换为JSON文件?

6

我有一个对象数组。我需要将它转换为.jsonl格式,并在使用lambda函数的节点中作为响应发送。我一直试图将它更改为字符串并添加'\n'使其成为新行,但没有成功。


2
你能否发布样本数据和期望的格式? - richytong
1
请澄清一下。您可以将对象数组以JSON格式放在同一行中,这是有效的单记录JSONL文件。如果您希望数组的每个项成为单独的行/记录,请将每个元素单独转换为字符串,并使用换行符将生成的字符串连接在一起。 - Mark Reed
1
https://www.npmjs.com/package/jsonlines - user120242
1
你应该将那个作为回答而不是评论发布,@user120242。 - Mark Reed
上面发布的包已经有6年了,不要使用它。同样的,https://www.npmjs.com/package/json-to-jsonl也已经5年没有更新了。使用下面的最佳答案就可以了,非常简单。 - Oleg Abrazhaev
2个回答

15

生成jsonlines的简单代码。 jsonlines实际上只是一堆单行JSON对象串联在一起并用换行符连接起来的字符串化对象。 就是这样。
你需要处理的另一个问题是转义Unicode,所以当你写入文件时,必须使用UTF-8编码。

使用jsonlines npm库的repl.it演示:https://repl.it/repls/AngelicGratefulMoto

Simple plain JS demo:

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')
)


1
链接 https://replit.com/repls/AngelicGratefulMoto 是使用 jsonlines npm 库的 repl.it 演示已经失效。 - imsheth

-1

解决大量数据从 .json 转换为 .jsonl 的方法:

在实施@user120242的答案之前进行的猴子补丁尝试失败了,因为数据中存在 {、}、[、]。 @user120242的答案适用于较小的数据,并且确实是一种干净的解决方案,对于我来说,在 对象数组 数据量达到约 100 MB 时仍有效,而超过该范围则会失败(我的解决方案可以在 node.js v14.1.0 下使用 DockerOperatorairflow v2.0.1 中运行,可处理大小约为 100 MB对象数组,但对于大小在 750 MB 左右的对象数组,它将失败,出现以下问题:JSON.stringify throws RangeError: Invalid string length for huge objects)。 试图实现与https://dev.to/madhunimmo/json-stringify-rangeerror-invalid-string-length-3977类似的解决方案,将.json转换为.jsonl,但遇到与上述相同的问题 - JSON.stringify throws RangeError: Invalid string length for huge objects。 实施@Bergi的答案中的for...of - Using async/await with a forEach loop对我来说效果很好,具有出色的性能(我的实现可以在 node.js v14.1.0 下使用DockerOperatorairflow v2.0.1中运行,可处理大小约为750 MB对象数组)。

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提供默认值以上的额外内存,则在处理较大数据(通常>100 MB)时,您将面临Node JS Process out of memory问题。以下是在Dockerfile中使用的解决方法(将6144替换为您想要分配的内存量MB

CMD node --max-old-space-size=6144 app.js

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接