有谁对ecshop的json解析机制比较了解,帮看一下这个为什么报错了

2016-07-07 15:01 来源:www.chinab4c.com 作者:ecshop专家



有谁对ecshop的json解析机制比较了解,帮看一下这个为什么报错了
代码:
<?php
define('IN_ECS', true);
require(dirname(__FILE__) . '/includes/init.php');
include_once('includes/cls_json.php');
$json = new Json();
$goods = $json->decode('{"spec":[], "goods_id":4154, "sale_user_id":3, "number":1, "parent":0}');
var_dump($goods);
?>
报错:

Fatal error: Bad string at offset 12: {"spec":[], "goods_id":4154, "sale_user_id":3, "number":1, "parent":0} in E:\workspace\demo\includes\cls_json.php on line 186



自已解决了这个问题:

是cls_json.php的一个bug:
出问题的原因是json串中用逗号分开的各个部分不能有空格,要是有空格就无法解析了,形如:
'{"spec":[],"goods_id":4154,"sale_user_id":3,"number":1,"parent":0}'
就可以解析,但是这样的
'{"spec":[], "goods_id":4154,"sale_user_id":3, "number":1, "parent":0}'
就无法解析了


解决办法是:
方法str中加上过滤掉空格的处理就可以了
/**
* handles strings
*
* @accessprivate
*
* @returnvoid
*/
function str()
{
$i = '';
$s = '';
$t = '';
$u = '';
while($this->ch ==" ") $this->next();
if ($this->ch == '"')
{
while ($this->next() !== null)
{
if ($this->ch == '"')
{
$this->next();
return $s;
}
elseif ($this->ch == '\\')
{
switch ($this->next())
{
case 'b':
$s .= '\b';
break;
case 'f':
$s .= '\f';
break;
case 'n':
$s .= '\n';
break;
case 'r':
$s .= '\r';
break;
case 't':
$s .= '\t';
break;
case 'u':
$u = 0;
for ($i = 0; $i < 4; $i++)
{
$t = (integer) sprintf('%01c', hexdec($this->next()));
if (!is_numeric($t))
{
break 2;
}
$u = $u * 16 + $t;
}
$s .= chr($u);
break;
case '\'':
$s .= '\'';
break;
default:
$s .= $this->ch;
}
}
else
{
$s .= $this->ch;
}
}
}
$this->error('Bad string');
}



HEHE,这也算官方的一个小bug吧

回答:
你参数那儿好像有毛病啊

不是参数的问题,自已解决了,可能是cls_json.php的一个bug:
出问题的原因是json串中用逗号分开的各个部分不能有空格,要是有空格就无法解析了,形如:
'{"spec":[],"goods_id":4154,"sale_user_id":3,"number":1,"parent":0}'
就可以解析,但是这样的
'{"spec":[], "goods_id":4154,"sale_user_id":3, "number":1, "parent":0}'
就无法解析了

楼上两位说是传参的问题,至于传参,
$json->decode($str,$type),是两个参数,第一个是要解析的字符串,第二个是解析后以数据类型,一般不用传第二个参数。

你的程序不是 2.7 吧!

是2.7.0的,但定制功能了

谁能帮帮忙啊,我也是这个问题,具体步骤啊。。

既然是json,就要按照json的规范编码和解析字符串。注意:键值对之间用逗号分隔,没有允许使用空格!
都提示bad string 了,说明是你给他的json_decode()的参数不符合json规范的字符串!