Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 无法对GET参数进行json_解码_Php_Ajax_Json - Fatal编程技术网

Php 无法对GET参数进行json_解码

Php 无法对GET参数进行json_解码,php,ajax,json,Php,Ajax,Json,全部, 我试图将一个字符串化的json对象作为GET参数传递,但接收URL似乎无法对其进行解码,我不知道为什么 以下是相关代码: 客户端Json对象生成(工作正常): 客户端ajax调用(工作正常): 这将生成以下URL:Ajax_recordSetGet.php?set=%7B%22setTitle%22%3A%22test%22%2C%22setTags%22%3A%22test%20%22%2C%22set%22%3A%5B%7B%22第一个%22%3A%22Joe%22%2C%22%2C

全部,

我试图将一个字符串化的json对象作为GET参数传递,但接收URL似乎无法对其进行解码,我不知道为什么

以下是相关代码:

客户端Json对象生成(工作正常):

客户端ajax调用(工作正常):

这将生成以下URL:
Ajax_recordSetGet.php?set=%7B%22setTitle%22%3A%22test%22%2C%22setTags%22%3A%22test%20%22%2C%22set%22%3A%5B%7B%22第一个%22%3A%22Joe%22%2C%22%2C%22检查过的%22%3A%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());
}
?>
然后URL变成
Ajax\u 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}]}'(长度=90)

null

string'Json最后一个错误是4'(长度=20)

超全局变量$\u GET和$\u请求已被解码。对$\u GET或$\u请求中的元素使用urldecode()可能会产生意外和危险的结果。

尝试另一种方法。我建议base64编码json字符串

与此相反:

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));

我不知道为什么,但是你的URL中有一个尾随的双引号,这会扰乱JSON解码过程

...%7D%5D%7D"   <- Trailing double quote

…%7D%5D%7D“请了解.TL;博士,试着让你的问题更简洁。如果我们需要更多,我们会问。我没有读过很多代码。我删除了不相关的(我希望…)代码。为什么?另外,请注意,我在原始
$\u GET
参数和解码版本上都尝试了
json\u decode
。两者都不起作用。这是php中常见的问题。Php就是这样实现的。我不喜欢它,但它是一个黄蜂窝。Php正在破坏您的urlencoded get参数。这是没有办法的。因此,请使用不同的编码机制。这是我答案的核心。如果它是POST变量,我需要编码吗?我需要找到一个适用于UTF-8非拉丁字符的解决方案。当然!帖子不受影响。就在第一个双引号之前是反斜杠。你是对的,URL末尾有一个双引号,在这里没有什么可做的。。。。当我手动删除它时,json_解码工作正常。
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));
...%7D%5D%7D"   <- Trailing double quote
...true}]}"' (length=90) <- double quote is inside the string, the single quote is part of the var_dump output.