$ _POST ['myjsonitem']时,PHP添加双反斜杠,从而导致JSON_ERROR_SYNTAX

时间:2018-10-07 09:36:51

标签: php json

不能相信,涉及该主题的数以百万计的帖子,但我无法使其正常工作。

在我的Android应用中,我正在向服务器发送截击POST请求。该请求是一个正常的StringRequest,它包含一个序列化的json对象。

在服务器上,POST请求中的项目以这种方式到达,我通过

提取了原始数据
$entityBody = file_get_contents('php://input');

=>

myjsonitem=%5B%7B%22description%22%3A%22Back%22%2C%22freeText%22%3A%22%22%2C%22isRated%22%3Atrue%2C%22priceSingle%22%3A12.0%2C%22ratingStar%22%3A4.0%7D%2C%7B%22description%22%3A%22SoronA%22%2C%22freeText%22%3A%22%22%2C%22isRated%22%3Atrue%2C%22priceSingle%22%3A3.5%2C%22ratingStar%22%3A5.0%7D%5D

如您所见,该项目在各个json元素周围带有双引号,对我来说到目前为止,这似乎是正确的。

当我想通过以下方式对字符串进行json_decode时,问题就开始了:

$itemList = json_decode($_POST['myjsonitem'], true); 

此命令返回json_decode错误JSON_ERROR_SYNTAX。 我不明白为什么,所以我通过以下方式将json写入了日志:

error_log("Json String: " .$_POST['myjsonitem']);

日志中的结果显示:

Json String: [{\\"description\\":\\"Back\\",\\"freeText\\":\\"\\",\\"isRated\\":true,\\"priceSingle\\":12.0,\\"ratingStar\\":4.0},{\\"description\\":\\"SoronA\\",\\"freeText\\":\\"\\",\\"isRated\\":true,\\"priceSingle\\":3.5,\\"ratingStar\\":4.0}]

如您所见,在双引号前面添加了双反斜杠。将此字符串放入JSON验证程序中会返回无效的json。删除doulbe反斜杠将返回有效的json。

魔术引号不可能是问题,因为我正在运行php 7 +。

这是怎么回事?如何正确解析PHP?我想,只是简单地删除双反斜杠就无济于事,在我的freeText字段中,我可以使用带双引号的字符串,因此在这种情况下转义仍然有效。

编辑:这是上下文的关键部分。也许我应该提到我是在wordpress安装上运行此程序的,并且在我的php文件的开头,我包括wp-load.php。

if($_SERVER['REQUEST_METHOD']=='POST'){

    //getting some other data from request  
    $dateString = $_POST['date'];   
    $date = date('Y-m-d H:i:s', strtotime($dateString));        
    $userId = intval($_POST['userId']); 
    $sentUniqueId = $_POST['uniqueId']; 

    //crucial part goes here:   
    $itemsList = json_decode($_POST['myjsonitem'], true);   

    //output 
    error_log("Json String: " .$itemsList);

我发布的输出(带有两个反斜杠的输出)在我的error_log文件中。

2 个答案:

答案 0 :(得分:0)

您的原始响应是URL Enoded。您需要先将其传递到urldecode中,然后再使用json_decode对其进行解码:

$json = urldecode($_POST['myjsonitem']);
$json = json_decode($json, true);

答案 1 :(得分:0)

我终于找到了答案。最重要的事情:我试图在 Wordpress 上下文中运行此php代码。 Deep down in the Wordpress function reference I found this:

  

无论get_magic_quotes_gpc()返回什么,WordPress都会在$ _POST / $ _ GET / $ _ REQUEST / $ _ COOKIE中添加斜杠。因此,在WordPress的上下文中,使用这些变量时应始终使用stripslashes()或stipslashes_deep()。

好的,现在解决方案很简单:

$my_value = stripslashes($_POST['myjsonitem']); 
$itemsList = json_decode($my_value, true); 

它删除了转义json元素的双引号的斜杠,但DID不删除相应文本字符串中的斜杠,这正是我所需要的。