Node和Express如何发送JSON格式数据

36
我想用Express发送格式化的JSON数据。下面是我的代码:
var app = express();

app.get('/', function (req, res) {
  users.find({}).toArray(function(err, results){
    // I have try both
    res.send(JSON.stringify(results, null, 4));
    // OR
    res.json(results);
  });
});
我在浏览器中得到的JSON是字符串,如何发送它以使其在浏览器中可读?

我在浏览器中获得了JSON字符串,如何发送它以使其在浏览器中可读?


1
JSON始终是一个字符串。要将对象返回,您必须在客户端上解析该字符串。 - Sirko
7个回答

103

尝试在Node应用程序上设置"secret"属性json spaces

app.set('json spaces', 2)

上面的语句将对 JSON 内容进行缩进。


2
我认为JSON.stringify()加上content-type头是人们应该理解的“官方”方式,但这个秘密属性更受欢迎,因为它更聪明! - Zhiyong
绝对是今天的技巧!与 app.use(express.json()) 结合使用,使用 res.json() 要比 res.send(JSON.stringify(), null, 4) 更加简洁。 - Oblx
最方便的方法,易于在开发/生产环境中打开/关闭。文档:http://expressjs.com/en/4x/api.html#app.set - Ryan
有办法使它变成彩色吗? - Lucifer
@Lucifer,关于颜色,这取决于您如何使用端点,例如,如果您使用Google Chrome,您可以安装一个扩展程序来完成此操作。 - Alexis Diel
我是指从服务器端本身。我的Express应用程序能够强制执行带颜色的JSON吗? - Lucifer

55

你需要设置 Content-Type 为 application/json ,像这样:

app.get('/', function (req, res) {
    users.find({}).toArray(function(err, results){
        res.header("Content-Type",'application/json');
        res.send(JSON.stringify(results, null, 4));
  });
});

谢谢,使用字符串化的方式可以解决问题。请编辑您的帖子,以便更清晰,我可以验证它。 - BoumTAC

7
使用type('json')设置Content-Type,使用JSON.stringify()进行格式化:
var app = express();

app.get('/', (req, res) => {
  users.find({}).toArray((err, results) => {
    res.type('json').send(JSON.stringify(results, null, 2) + '\n');
  });
});

1
从服务器发送格式化的JSON输出可能会考虑到服务器资源使用和性能,特别是在生产环境中。相反地,您可以在客户端找到几种方法来格式化JSON输出。如果您正在使用Chrome,则可以在Chrome Web Store中使用JSON Formatter, JSON Viewer, JSONView等扩展程序。自Firefox 44以来,Firefox提供了内置的JSON viewer

当在命令行或shell脚本中使用curlwget时,您可以将JSON结果导入jq

$ curl http://www.warehouse.com/products | jq .

0

为了方便起见,您可以在自定义中间件中覆盖res.json,该中间件在您的路由之前运行。

要自动格式化所有 JSON 响应:

app.use('*', (req, res, next) => {
    res.json = (data) => res.type('json').send(JSON.stringify(data, null, 4))
    next()
})

app.get('/route', (req, res) => res.json({ formatted: true })

为了允许基于个别路由或其他逻辑进行自定义格式化:

app.use('*', (req, res, next) => {
    res.json = (...args) => res.type('json').send(JSON.stringify(...args))
    next()
})

app.get('/tabs', (req, res) => res.json({ formatted: 'tabs' }, null, '\t')
app.get('/spaces', (req, res) => res.json({ formatted: 'spaces' }, null, 4)
app.get('/minified', (req, res) => res.json({ formatted: false })

0

这应该能解决你的问题

var app = express();
app.set('json spaces', 4)

app.get('/', function (req, res) {
  users.find({}).toArray(function(err, results){
      res.json(JSON.parse(results));
  });
});

-2

也许你需要使用 JSON.parse(resp)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接