web-dev-qa-db-ja.com

PHPからのajax JSON応答内の文字列内に二重引用符を入れるにはどうすればよいですか?

サーバーからAjaxリクエストでJSONレスポンスを受け取ります。このように動作します:

{"a": "1"、 "b": "hello 'kitty'"}

しかし、kittyを二重引用符で囲むことに成功しませんでした。

Ajax応答で「」を\ x22に変換しても、JavaScriptによって「」として解釈され、JSONを解析できません。

\をエスケープし、後でエスケープ解除する必要があります(これは可能です)。

これを行う方法?

編集:私はそれをうまく表現したかどうかわからない: "b"の中にこの文字列が欲しいafter解析:

ハローキティ"

必要に応じて、「b」を変換するために解析後に追加のステップを追加することもできますが、必要ではないと思いますが、よりエレガントな方法があるので、これは自動的に行われますか?

Edit2: ajaxページはphpによって生成されます。 bの値を作成するためにいくつかのことを試みましたが、すべてページでJSON解析エラーが発生しました。

  $b = 'hello "kitty"';      

  // no 1:
  //$b = str_replace('"',"\x22",$b);

  // or no 2:
  // $b = addslashes($b);  

  // or no 3: 
  $b = str_replace('"','\"',$b);

  echo '{ "a" : "1", "b" : "' . $b . '"}';

Edit3:このソリューションは最終的に動作します:

$b = 'hello "kitty"';      
$b = str_replace('"','\\"',$b); 
echo '{ "a" : "1", "b" : "' . $b . '"}';
40
user89021

バックスラッシュでエスケープするだけです:

> JSON.stringify({"a": 5, "b": 'a "kitty" mighty odd'})
{"a":5,"b":"a \"kitty\" mighty odd"}
> JSON.parse('{"a":5,"b":"a \\"kitty\\" mighty odd"}')
Object
  a: 5
  b: a "kitty" mighty odd
  __proto__: Object

JSONパーサーは\"二重引用符として二重引用符で囲まれた文字列内。 2番目の例では、Javascriptパーサーパスがあり、次に別のJSONパーサーパスがあるため、ダブルバックスラッシュが必要であることに注意してください。

56
Max Shawabkeh

json_encode(any PHP element)のみを使用すると、自動的に解析されます。

2
mahesh

少し変わった方法で、サーバーでJavaScript/NodeJSを使用し、ES6テンプレートリテラル(「クリスチャン」の周りで使用されるバックティック ``)を使用できますが、7年後、おそらくNodeJSをすでに使用しています

var myJSON = {
    "name": {
        "first": `"Christian"`,
        "last": "Broberg"
    },
    "age": 49,
    "skills": [ "JavaScript", "React", "NodeJS" ],
    "married": false,
    "superpowers": null
}
0