json_decode不对我的变量起作用,但是在其内容上

时间:2013-07-22 09:00:47

标签: php json

我有以下代码:

$param = $params[0];
var_dump($param->getValue());
$test = json_decode($param->getValue());
var_dump($test);

我的第一个var_dump返回以下内容:

string(133) ""[{\"lang_id\": \"1\", \"naam\": \"dsfsdfds\", \"mail\": \"dsfdsfs\"}, {\"lang_id\": \"1\", \"naam\": \"dfsd\", \"mail\": \"dfds\"}]""

seconde将返回以下内容:

string(107) "[{"lang_id": "1", "naam": "dsfsdfds", "mail": "dsfdsfs"}, {"lang_id": "1", "naam": "dfsd", "mail": "dfds"}]" 

并将值保存在我的数据库中,如下所示:

"[{\"lang_id\": \"1\", \"naam\": \"dsfsdfds\", \"mail\": \"dsfdsfs\"}, {\"lang_id\": \"1\", \"naam\": \"dfsd\", \"mail\": \"dfds\"}]"

现在我的问题是:为什么它会在json_decode之后返回一个字符串? 我完全不知道我做错了什么,最奇怪的是,如果我用该变量的实际值替换变量,那么解码是正确的:

$test = json_decode("[{\"lang_id\": \"1\", \"naam\": \"dsfsdfds\", \"mail\": \"dsfdsfs\"}, {\"lang_id\": \"1\", \"naam\": \"dfsd\", \"mail\": \"dfds\"}]");

返回

array(2) { 
    [0]=> object(stdClass)#3255 (3) { 
        ["lang_id"]=> string(1) "1" 
        ["naam"]=> string(8) "dsfsdfds" 
        ["mail"]=> string(7) "dsfdsfs" 
     } 
    [1]=> object(stdClass)#3256 (3) { 
        ["lang_id"]=> string(1) "1" 
        ["naam"]=> string(4) "dfsd" 
        ["mail"]=> string(4) "dfds" 
     } 
}

我做错了什么?

3 个答案:

答案 0 :(得分:4)

因为你的字符串是json_encoded两次,所以你需要解码它两次。

string(133) ""[{\"lang_id\": \"1\", \"naam\": \"dsfsdfds\", \"mail\": \"dsfdsfs\"}, {\"lang_id\": \"1\", \"naam\": \"dfsd\", \"mail\": \"dfds\"}]""

如果您查看上面的字符串,您会看到所有引号都被转义,并且在开头和结尾都有双引号。所以这意味着如果你json解码你得到一个没有转义引号的字符串。

如果再次解码,字符串将被解码为数组。

json_decode('"[12,24,32]"'); //php string:  [12,24,32]
json_decode('[12,24,32]'); //php array(12, 24, 32);

答案 1 :(得分:0)

问题是你的整个字符串都用引号括起来。

它是一个JSON字符串,但它是一个JSON字符串,只包含一个字符串变量....字符串变量本身包含一个有效的JSON字符串,但就JSON解码而言,这个事实是无关紧要的;它只看到JSON是单个字符串变量。

您可以通过对解码输出执行json_decode()来证明这一点:然后您应该得到您期望的数组。

看起来您的数据已经以某种方式进行了双重编码。因此,虽然进行第二次解码会给你想要的结果,但我建议不要试图通过双重解码来解决问题,而应该尝试找出双重编码发生的位置并修复它。

希望有所帮助。

答案 2 :(得分:0)

你的刺痛不是有效的json(逃避引号)。

$atring = '[{"lang_id": "1", "naam": "dsfsdfds", "mail": "dsfdsfs"}, {"lang_id": "1", "naam": "dfsd", "mail": "dfds"}]';

使用JSON Fromatter工具检查字符串是否为avalid json。 http://jsonformatter.curiousconcept.com/