有没有办法将 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 中使用DockerOperatorairflow v2.0.1 中执行~100 MB~100 MBarray 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 55c4c88airflow 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?

使用jackson将json对象列表转换为hashmap

将自定义javascript对象转换为json [重复]

使用 Moshi 将字符串日期从 json 转换为 Date 对象

有没有办法将 Django 模型查询集转换为模板中的 json 或 json 字符串?

有没有办法将 JSON Schema 转换为 XSD? [关闭]