Php 无法对GET参数进行json_解码
全部, 我试图将一个字符串化的json对象作为GET参数传递,但接收URL似乎无法对其进行解码,我不知道为什么 以下是相关代码: 客户端Json对象生成(工作正常): 客户端ajax调用(工作正常): 这将生成以下URL: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
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.