【问题标题】:is there a way to convert a json object to json l file有没有办法将 json 对象转换为 json l 文件
【发布时间】:2020-09-18 06:06:55
【问题描述】:

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

【问题讨论】:

  • 您能发布示例数据和预期格式吗?
  • 请澄清。您可以将 JSON 格式的对象数组全部放在一行上,这是一个有效的单记录 JSONL 文件。如果您希望数组的每个项目成为单独的行/记录,只需将每个元素单独转换为字符串,然后将结果字符串与换行符连接在一起。
  • 您可能应该将其发布为答案而不是评论,@user120242。

标签: javascript node.js lambda


【解决方案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')
)

【讨论】:

【解决方案2】:

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

  1. 由于数据中存在{}[],在实施@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{'));
  2. @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)

  3. .json 转换为.jsonl 的与https://dev.to/madhunimmo/json-stringify-rangeerror-invalid-string-length-3977 类似的解决方案的跟踪与上述相同的问题不起作用 - JSON.stringify throws RangeError: Invalid string length for huge objects

  4. @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

【讨论】:

    猜你喜欢
    • 2012-05-03
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 2023-04-09
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    相关资源
    最近更新 更多