19

blockiREST API を使用してシリアライズおよび更新したいという JavaScript オブジェクトがあります。だから私は電話します:

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の例によると、単一引用符で囲まれた文字列を返す必要があります。しかし、そのページで同じ例を試すと、文字列が二重引用符で囲まれます。たとえばJSON.stringify({})、Firefox と Chrome コンソールを入力すると、"{}"代わりに返され'{}'ます。

外側の引用符が'. 繰り返しますが、この文字列は私が達成したいことの例です:

'{"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 リクエストが正常に処理され、オブジェクトが更新されます。

4

5 に答える 5

8

文字列を囲む一重引用符は必要ありません。これらは、出力に対応する文字列リテラルを表示するために 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 呼び出しを行うことをお勧めします。

于 2012-11-05T21:50:25.570 に答える
5

メソッドによって自動的に行われるエスケープを除いて、一重引用符または二重引用符で囲まれた文字列に違いはありませんJSON.stringify。文字列リテラルを囲む一重/二重引用符は、文字列自体の一部ではありません。

二重引用符は、Firefox と Chrome がコンソールで文字列リテラルを表すのに好んで使用する方法です。


編集: CURL コマンドを使用すると、質問の意味が完全に変わります。

"{"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}}"

二重引用符で囲まれた文字列内にエスケープされていない二重引用符を含めることはできないため、上記の文字列は有効な文字列ではありません。

于 2012-11-05T21:49:47.573 に答える
2

たとえば、Firefox と Chrome コンソールで JSON.stringify({}) と入力すると、「{}」ではなく「{}」が返されます。

これは、コンソールに文字列が表示される方法です。実際にはそうではありません"{}"が、を含む文字列です{}。引用符は、それが文字列であることを示すためのものです。Chrome コンソールで「」と入力してみてください。意味がわかります。

于 2012-11-05T21:51:02.360 に答える
2

表示されているのは、コンソールが文字列を出力する方法の単なるアーティファクトです。

つまり、Chrome のコンソールでこれを試してみてください...

JSON.parse(
  JSON.stringify(
    JSON.parse(
      JSON.stringify(
        JSON.parse(
          '{"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}}'
))))).name
于 2012-11-05T21:50:29.290 に答える
1

前後の一重引用符/二重引用符は、それが文字列であることを示すだけであり、実際の文字列データの一部ではなく、保存できません。

var serializedData = JSON.stringify({"name":"Updated Blocki","bounds":{"x":"2em","y":"2em","w":"8em","h":"12em"}});
var deserializedData = JSON.parse(serializedData);  // whether console displays the serializedData String with single or double quotes is irrelevant

String を保存してクライアント側に出力する場合は、これまでと同じように一重引用符で囲みます。

curl を使用するときに一重引用符で囲むのを妨げるものはありますか?

二重引用符で囲むことを主張する場合は、次のように文字列内の二重引用符をエスケープする必要があります。

"{\"name\":\"Updated Blocki\",\"bounds\":{\"x\":\"2em\",\"y\":\"2em\",\"w\":\"8em\",\"h\":\"12em\"}}"
于 2012-11-05T22:00:50.217 に答える