1

全て、

文字列化された json オブジェクトを GET パラメータとして渡そうとしていますが、受信 URL がそれをデコードできないようです。理由はわかりません。

関連するコードは次のとおりです。

クライアント側の Json オブジェクトの生成 (正常に動作):

function createJson(){
// This works fine.  It creates a json objects with three elements, the third being an array.
//(omitted code for brevity)
  return jsonData;
}

クライアント側の ajax 呼び出し (正常に動作):

function recordSetGet(jsonData){
  request = createRequest();
  var rawSet=JSON.stringify(jsonData);
  var encodedSet=encodeURIComponent(rawSet);
  var params="set="+encodedSet;
  var url= "Ajax_recordSetGet.php?"+params;
  request.open("GET", url, true);
  request.onreadystatechange = function(){}
  request.send(null);
}

これにより、次の URL が生成されます。Ajax_recordSetGet.php?set=%7B%22setTitle%22%3A%22test%22%2C%22setTags%22%3A%22test%20%22%2C%22set%22%3A%5B%7B%22first%22%3A%22Joe%22%2C%22last%22%3A%22Doe%22%2C%22checked%22%3Atrue%7D%5D%7D"

サーバー側の処理:

<?php
header('Content-Type:text/html; charset=UTF-8');  
if(!session_id()){
  session_start();
}
if(isset($_GET['set'])){
  $set=$_GET['set'];//This is the URI encoded string
  var_dump ($set);
  var_dump (json_decode($set));
  var_dump ("Json last error is ".json_last_error());
}
?>

var_dumps の結果は次のとおりです。 string '{"setTitle":"test","setTags":"test ","set":[{"first":"Joe","last":"Doe","checked":true}]}"' (length=90)
null
string 'Json last error is 4' (length=20)

では、なぜjson_decode()ここで失敗するのでしょうか。json_last_error()結果は、構文エラーを示唆しています。

編集:エンコードされていない文字列を送信すると、json_decodeも失敗することに注意してください:
次のようにエンコードせずにparam文字列を作成すると:

var rawSet=JSON.stringify(jsonData);
var params="set="+rawSet;
var url= "Ajax_recordSetGet.php?"+params;

次に、URLは次のようになりますAjax_recordSetGet.php?set={"setTitle":"test","setTags":"test ","set":[{"first":"Joe","last":"Doe","checked":true}]}"

また、受信 URL var_dump で同じエラーが発生します。
string '{"setTitle":"test","setTags":"test ","set":[{"first":"Joe","last":"Doe","checked":true}]}"' (length=90)
null
string 'Json last error is 4' (length=20)

4

2 に答える 2

1

http://php.net/manual/en/function.urldecode.php

スーパーグローバル $_GET と $_REQUEST は既にデコードされています。$_GET または $_REQUEST の要素で urldecode() を使用すると、予期しない危険な結果が生じる可能性があります。

別の方法を試してください。JSON文字列をbase64でエンコードすることをお勧めします。

これの代わりに:

var rawSet=JSON.stringify(jsonData);
var encodedSet=encodeURIComponent(rawSet);
var params="set="+encodedSet;
var url= "Ajax_recordSetGet.php?"+params;

これを行う:

var rawSet=JSON.stringify(jsonData);
var encodedSet=btoa(rawSet);
var params="set="+encodedSet;
var url= "Ajax_recordSetGet.php?"+params;

ただし、注意事項に注意してください。

そしてあなたのサーバーサイドで:

$decodedSet=json_decode(base64_decode($set));
于 2013-09-10T20:56:47.400 に答える