1. ホーム
  2. json

[解決済み] nodeやExpressを使用してJSONを返す正しい方法

2022-03-19 11:02:20

質問

そこで、次のようなJSONオブジェクトの取得を試みることができる。

$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=ISO-8859-1
Date: Wed, 30 Oct 2013 22:19:10 GMT
Server: Google Frontend
Cache-Control: private
Alternate-Protocol: 80:quic,80:quic
Transfer-Encoding: chunked

{
   "anotherKey": "anotherValue",
   "key": "value"
}
$

nodeやexpressを使って、サーバーからのレスポンスに全く同じボディを生成する方法はありますか?もちろん、ヘッダーを設定して、レスポンスのcontent-typeが"application/json"であることを示すことはできますが、その後、オブジェクトを書き込んで送信する方法はさまざまです。私がよく目にするのは、次のようなコマンドを使用する方法です。

response.write(JSON.stringify(anObject));

しかし、これには2点、あたかも問題であるかのように主張できる点があります。

  • 文字列を送信しています。
  • さらに、末尾に改行文字がない。

もう一つのアイデアは、コマンドを使用することです。

response.send(anObject);

これは、上記の最初の例と同様に、curlの出力に基づいてJSONオブジェクトを送信しているように見えます。しかし、ターミナル上で再びcurlが使用されている場合、ボディの末尾に改行文字は存在しません。では、実際にnodeやnode/expressを使って、このように末尾に改行があるものを書き出すにはどうしたらよいのでしょうか。

解決方法は?

そのレスポンスも文字列なので、もし何らかの理由でレスポンスをプリセットして送りたい場合は、次のようなものを使うことができます。 JSON.stringify(anObject, null, 3)

を設定することが重要です。 Content-Type ヘッダーを application/json も、そうです。

var http = require('http');

var app = http.createServer(function(req,res){
    res.setHeader('Content-Type', 'application/json');
    res.end(JSON.stringify({ a: 1 }));
});
app.listen(3000);

// > {"a":1}

プレタポルテ

var http = require('http');

var app = http.createServer(function(req,res){
    res.setHeader('Content-Type', 'application/json');
    res.end(JSON.stringify({ a: 1 }, null, 3));
});
app.listen(3000);

// >  {
// >     "a": 1
// >  }

なぜ改行で終わらせたいのかよくわからないのですが、単に JSON.stringify(...) + '\n' を使えば実現できます。

エクスプレス

expressでは、以下の方法で行うことができます。 代わりにオプションを変更する .

'json replacer' JSONリプレイサーコールバック、デフォルトではNULL

'json spaces' JSONレスポンスのフォーマット用スペース、デフォルトは開発時2、運用時0

40に設定することは、実際には推奨されません。

app.set('json spaces', 40);

それなら、jsonで応答すればいいんじゃない?

res.json({ a: 1 });

これは 'json spaces '構成でプリティ化します。