You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现响应体每行一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:48:53