2016-05-23 9 views
1

json_decodeで変換する必要があるサーバー上にJSON文字列があります。この文字列には何も含めることができます。問題を再現するのが難しいのですが、私はテストとして次のように試しました:PHP json_decode backslash

$data = '{"client":"Test @#€%&-+()\/\\_*\""}'; 
$data = json_decode($data); 
var_dump($data); die; 

これはNULLを返します。 \\を削除すると、コードが機能します。私はGoogle Dev Toolsでこれを試してみました.Javascriptで動作します。 json_decodeでどのように動作させることができますか?

ありがとうございます!

+0

この文字列の\の目的は何ですか?エスケープしたり、\ charをリテラルにするには? – AbraCadaver

+0

\\\または\\\\を使用すると、リテラルのバックスラッシュ( '\\')charを含むJSON文字列を正常にデコードします。 – lolbas

+0

@ lolbasは既に試してあり、nullも返しました。実際、str_replace( "\\\\"、...)は実際には全く機能しませんでした。 AbraCadaver、申し訳ありませんが、文字列が既に送信者(この場合はAndroidデバイス)によってエスケープされていたことを忘れていました。だから\\はリテラル\ charです。 – Sagito

答えて

0

ここでnullが発生する問題は、ダブルエスケープのために発生します.1つはPHP文字列、もう1つはjsonと解釈されます。だからいくつかの\を追加した後、それはそのように振る舞う:

php > $data = '{"client":"Test @#%&-+()\\/\\\\_*\""}'; 
var_dump(json_decode($data)); 
object(stdClass)#1 (1) { 
    ["client"]=> 
    string(18) "Test @#%&-+()/\_*"" 
} 

あなたはファイルにだけでなく、あなたのテストJSONを入れて、それを読んで、その後、あなたは、PHPの文字列として何をエスケープを心配する必要はありませんすることができます。

+0

返信いただきありがとうございます!残念ながら、これはユーザーの入力によって直接生成されます。このケースはテストでしたが、PHP側でデータを受け取るときに「特殊文字」にいくつかの問題がありました。私は入力を制御できないので、私はサーバー側の解決策を見つけなければなりません。 – Sagito