3

我有以下代码:

$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\"}]""

第二个返回以下内容:

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" 
     } 
}

我究竟做错了什么?

4

3 回答 3

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);
于 2013-07-22T09:04:48.730 回答
0

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

它是一个 JSON 字符串,但它是一个仅包含一个字符串变量的 JSON 字符串……该字符串变量本身包含一个有效的 JSON 字符串,但就 JSON 解码而言,这一事实无关紧要;它只将 JSON a 视为单个字符串变量。

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

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

希望有帮助。

于 2013-07-22T09:07:16.133 回答
0

您的刺痛不是有效的 json(转义引号)。

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

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

于 2013-07-22T09:11:40.820 回答