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

时间:2020-05-30 18:15:38

标签: javascript node.js lambda

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

2 个答案:

答案 0 :(得分:2)

生成JSON行的简单代码。 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')
)

答案 1 :(得分: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 MBarray of objects,除此之外它失败了(我的解决方案在 node.js v14.1.0 中工作,由 Docker version 20.10.5, build 55c4c88 使用 DockerOperatorairflow v2.0.1 upto data这是 ~100 MBarray of objects 并且它在 ~750 MBarray of objects 范围内的数据严重失败 - JSON.stringify throws RangeError: Invalid string length for huge objects)

  3. https://dev.to/madhunimmo/json-stringify-rangeerror-invalid-string-length-3977 转换为 .json 的与 .jsonl 类似的解决方案的跟踪与上述相同的问题不起作用 - 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 55c4c88 使用 { {3}} 在 DockerOperator 中,最多为 ~750 MB of 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");
    }
}

附言:如果您尚未提供高于默认值 >100 MB 的额外内存,您将面临 airflow v2.0.1 更大的数据(通常为 node.js v14.1.0),以下内容适用于 {{1} }}(将 Dockerfile 替换为您要分配的 6144 中的内存量)

MB
相关问题