如何实现响应体每行一个JSON对象的API?res.send用法疑问
嘿,别担心,这个问题一点都不浅显——很多刚接触Web开发的同学都会在处理这种非标准的JSON响应时卡壳!我来帮你理清楚怎么实现。
首先,你要的这种每行一个独立JSON对象的格式,其实是一种很常用的格式(常叫JSON Lines),要实现它,核心思路确实是把每个JSON对象转成字符串,再用换行符分隔,但我们可以用JS的数组方法让这个过程更简洁,完全不用手动拼接。
假设你用的是Express框架(从你提到的res.send()来看大概率是),我给你两种实现方式:
1. 一次性生成响应内容(适合数据量不大的情况)
这种方式把所有数据处理成一个字符串后发送,代码很简洁:
app.get('/somerequest', (req, res) => { // 你的数据源,可能是从数据库查出来的,这里用示例数组 const dataList = [ {"a": 1, "b": 2}, {"c": 1, "b": 3}, {"a": 4, "b": 2} ]; // 用map把每个对象转成JSON字符串,再用换行符连接起来 const responseContent = dataList.map(item => JSON.stringify(item)).join('\n'); // 设置响应头,告诉客户端这是JSON Lines格式(用text/plain也能正常解析,更规范的话用application/jsonl) res.set('Content-Type', 'application/jsonl'); res.send(responseContent); });
2. 流式发送响应(适合数据量大的场景)
如果你的数据很多,一次性生成大字符串会占用较多内存,这时候可以用res.write()逐行发送,最后用res.end()结束响应:
app.get('/somerequest', (req, res) => { res.set('Content-Type', 'application/jsonl'); const dataList = [ {"a": 1, "b": 2}, {"c": 1, "b": 3}, {"a": 4, "b": 2} ]; dataList.forEach(item => { // 逐行写入每个JSON字符串+换行符 res.write(`${JSON.stringify(item)}\n`); }); // 写完所有内容后结束响应 res.end(); });
为什么不能直接传数组给res.send()?
你可能会好奇,为什么不能直接把数组传给res.send()?因为Express的res.send()如果收到数组或对象,会自动把它序列化为标准JSON数组(也就是用[]包裹,元素之间用逗号分隔),这和你要的每行一个独立JSON的格式完全不一样,所以必须手动处理成字符串。
其实你最开始想到的思路是对的,只是用数组的map+join可以让代码更简洁优雅,完全不需要手动拼接每个字符串~
内容的提问来源于stack exchange,提问作者19
相关产品推荐
相关产品推荐

