[解決済み] nodeやExpressを使用してJSONを返す正しい方法
質問
そこで、次のような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
'構成でプリティ化します。
関連
-
[解決済み] ノード / エクスプレス EADDRINUSE、アドレスはすでに使用中です - サーバーを停止してください。
-
stdClass 型のオブジェクトを配列として使用できない
-
[解決済み] 複数の配列を持つJSONオブジェクトを作るにはどうしたらいいですか?
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み] Chromeを使用してASP.NET Web APIがXMLの代わりにJSONを返すようにするにはどうすればよいですか?
-
[解決済み] Node.JSを使用して、JSONファイルを(サーバー)メモリに読み込むにはどうすればよいですか?
-
[解決済み] FlaskのビューからJSONレスポンスを返す
-
[解決済み] node.jsでJSONをpretty-printするにはどうしたらいいですか?
-
[解決済み] Express アプリケーションで JSON POST データを消費する方法
-
[解決済み] jqを使用してJSONからキー名を取得する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Twitter API エラー 215
-
[解決済み] Azure VMのエラーです。"あなたのアカウントは、このデバイスを使用できないように設定されています。詳細については、システム管理者にお問い合わせください" [終了しました]。
-
TypeError: タイプ 'bytes' のオブジェクトは JSON シリアライズ可能ではありません。
-
[解決済み] JSONオブジェクトをTypeScriptのクラスにキャストする方法を教えてください。
-
[解決済み] jqを使用してJSONからキー名を取得する方法
-
[解決済み] 構造体に複数のネームタグを定義する方法
-
[解決済み] JSON、REST、SOAP、WSDL、そしてSOA。これらはどのように結びついているのか
-
[解決済み] JSONオブジェクトをBufferに変換し、BufferをJSONオブジェクトに戻す。
-
[解決済み] PostgresでJSONフィールドにインデックスを作成するには?
-
[解決済み] GoでJSONを部分的にマップにアンマーシャルする