如何对从JavaScript接收到的json数组进行json_decode?

时间:2018-06-20 14:50:36

标签: javascript php json

我想将json字符串编码的数据发送到PHP后端。为此,我使用一个GET参数表,该参数表中以URL编码的json数据的形式像这样的数组:["mystring1","mystring2"]

当我现在尝试使用php的json_decode函数对其进行解码时,它将返回null。另外,使用此输入字符串完全不会更改任何内容:{"mykey":["mystring1","mystring2"]}

这是我的完整代码示例:

JavaScript:

var myArr = [];
myArr.push('mystring1');
myArr.push('mystring2');
window.location.href = 'example.com/index.php?myparam=' + encodeURIComponent(JSON.stringify(myArr));

PHP后端站点:

$jsonStr = filter_input(\INPUT_GET, 'myparam', \FILTER_SANITIZE_STRING);
var_dump($jsonStr);
var_dump(json_decode($jsonStr, true));

第一个var_dump正确打印json字符串,第二个返回null。使用assoc标志(第二个json_encode参数)没有任何改变。

我希望得到的东西:

array(2) { [0]=> string(9) "mystring1" [1]=> string(9) "mystring2" }

我实际上得到了什么:

NULL

var_dump for $jsonStr为我返回了以下内容:

string(41) "["mystring1","mystring2"]"

2 个答案:

答案 0 :(得分:2)

我正在从What does FILTER_SANITIZE_STRING do?转移笔记,但是该问题中的所有公认答案都可以更好地说明这一点:

  

首先-php_filter_strip。它并没有做太多事情,只是获取传递给函数的标志并进行相应处理。它会做有据可查的事情。

     

然后,我们构建某种地图并调用php_filter_encode_html。更有意思:它将ASCII码小于32且大于127的字符“,”和&字符转换为HTML实体,因此字符串中的&变成&。再次使用标志为此。

     

然后我们调用php_strip_tags_ex,它仅剥离HTML,XML和PHP标记(根据/ext/standard/string.c中的定义)并删除NULL字节,如注释中所述。

(强调了重要部分)。

简而言之,FILTER_SANITIZE_STRING将破坏您的JSON,因为它将对不应该编码的东西进行编码。如果要验证此输入,请不要使用此过滤器。

此处的答案是不使用FILTER_SANITIZE_STRING。 验证JSON字符串的明智方法是执行json_decode并检查其是否为空。

$jsonStr = filter_input(\INPUT_GET, 'myparam'); 
var_dump($jsonStr); 
var_dump(json_decode($jsonStr, true)); 

答案 1 :(得分:0)

这里的错误与JSON无关,而在于使用编码的URI组件的请求。

如果在JS端使用encodeURIComponent,那么在PHP端也必须使用urldecode

<?php
$jsonStr = '%5B%22mystring1%22%2C%22mystring2%22%5D';
var_dump(
    json_decode(urldecode($jsonStr), true)
);

请参阅:http://php.net/manual/en/function.urldecode.php