という JavaScript オブジェクトがあり、これblocki
を REST API を使用してシリアル化して更新したいと考えています。そこで、次のように呼び出します。
JSON.stringify(blocki)
そして、次の文字列が得られます。
"{"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}}"
これはほぼ必要なことですが、二重引用符で囲まれた文字列の外側には、次のように一重引用符が必要です。
'{"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}}'
の例によるとMDN JSON.stringify一重引用符で囲まれた文字列を返すはずです。しかし、そのページで同じ例を試すと、二重引用符で囲まれた文字列が返されます。たとえば、Firefox と Chrome コンソールに入力すると、の代わりにJSON.stringify({})
が返されます。"{}"
'{}'
外側の引用符が となるように、Javascript オブジェクトを適切にシリアル化するにはどうすればよいでしょうか'
。繰り返しますが、この文字列は私が実現したいことの例です。
'{"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}}'
理想的には、シリアル化後に文字列を変更するのではなく、オブジェクトをシリアル化する優れた方法を学習したいと思います。
編集:私がこれをする必要があると思う理由は、私が使用しているAPIが、文字列が二重引用符で囲まれているとうまく動作しないからです。例えば、
curl -i -H "Accept: application/json" -H "Content-type: application/json" -X PUT -d "{"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}}" 'http://localhost:3000/api/blockies/17'
リクエストは失敗し、サーバーは解析エラーを返します。しかし、私が試してみると:
curl -i -H "Accept: application/json" -H "Content-type: application/json" -X PUT -d '{"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}}' 'http://localhost:3000/api/blockies/17'
PUT リクエストが正常に実行され、オブジェクトが更新されます。
ベストアンサー1
文字列を囲むシングルクォートは必要ありません。これらはMDNページに表示されるもので、文字列リテラル出力に対応します。
引用文はコンテンツ弦そのものの!
編集- 私が上記を書いた後、質問を編集しました。
簡単な答えは、文字列を一重引用符で囲む必要がある場合ですあなた自身、次のように使用します:
var json = "'" + JSON.stringify(obj) + "'"
より長い答えは、文字列をまったくラップすべきではないということです。コマンドライン全体をシェルに渡すことは悪い習慣と考えられています。特定の環境変数 (特にIFS
) が存在すると、コマンドラインの解釈方法が変わり、セキュリティ上の問題が発生する可能性があります。
Javascript を使用しているので、おそらくnodejs
とchild_process
モジュールを使用しているのではないでしょうか。その場合は、.spawn
の代わりに を使用し.exec
、パラメータを配列として渡す必要があります。この方法で渡すと、パラメータはargv
シェルによって最初に解析されることなく Curl の配列に直接渡されるため、引用符で囲む必要はまったくありません。例:
var child = spawn('curl', [
'-i', '-H', 'Accept: application/json',
'-H', 'Content-type: application/json',
'-X', 'PUT',
'-d', json,
'http://localhost:3000/api/blockies/17'
]);
あるいは、Curl を使用せずに Node から直接 PUT 呼び出しを行うのがさらに良いでしょう。