我有以下代码:
$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"
}
}
我做错了什么?
答案 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/