。 我们很快就发现了其中的不同,最明显的就是字符串两端的[]变成了{},那么这个字符串是否也可以按上面那样处理后被js访问呢?我们不防试一试: 复制代码 代码如下: <a href="javascript:show("<?php echo urlencode(json_encode(array("a"=>"1","b"=>"2","c"=>"3")));?>")" id="aj">访问json</a> function show(str){ var jobj=eval_r(decodeURI(str)); alert(jobj.a); }
大家如果动手试了就知道,点击链接后,没有出现弹窗。为什么呢?是PHP生成的json字符串格式不对吗?不是的,这是我们在使用eval函数解释的时候,出错了。把上面的函数代码换成: 复制代码 代码如下: function show(str){ var jobj=eval_r("("+decodeURI(str)+")"); alert(jobj.a); }
再试试吧!怎么样,可以访问了吧。这告诉我们,在使用eval方法处理带有键名的json字符串时,需要在字符串两端加速括号。至于为什么,站长也不知道,站在巨人的肩膀上而已。 这里要注意,尽管PHP生成的json字符串 {"a":"1","b":"2","c":"3"}被传递给js后无法被直接解释为json格式,但是如果你在js中使用该字符串直接创建json数据,是可以的。试试下面的代码吧: 复制代码 代码如下: var jobj={"a":"1","b":"2","c":"3"}; alert(jobj.b);
2、二维数组 二维数组在PHP用的应用非常广泛,因此了解二维数组转化后的json格式非常重要。有了上面的例子做铺垫,下面站长就直接给出示例代码: 复制代码 代码如下: <a href="javascript:show("<?php echo urlencode(json_encode(array(array("1","2","3"))));?>")" id="aj">访问json</a> function show(str){ var jobj=eval_r(decodeURI(str)); alert(jobj[0][0]); }
大家运行,会发现,这跟一维数组差不多,这是不带键名的例子,因此在show函数中,去掉字符串两端的括号也是可以的。 下面,我们对二维数组进行一下变化,在第二维中加入键名,请看示例代码: 复制代码 代码如下: <a href="javascript:show("<?php echo urlencode(json_encode(array(array("a"=>"1","b"=>"2","3"))));?>")" id="aj">访问json</a> function show(str){ var jobj=eval_r("("+decodeURI(str)+")"); alert(jobj[0].a); }
大家运行代码后,发现,这里我们访问json数据的方式有点不一样。上面我们用的是 alert(jobj[0][0]); 而这里我们用的是 alert(jobj[0].a);不要问我为什么,就是这样。这就是json的访问方式。 上面的例子,我们对二维数组的第二维添加了键名,下面我们对第一维添加键名,看看访问方式又有什么不同: 复制代码 代码如下: <a href="javascript:show("<?php echo urlencode(json_encode(array("k"=>array("1","2","3"))));?>")" id="aj">访问json</a> function show(str){ var jobj=eval_r("("+decodeURI(str)+")"); alert(jobj.k[1]); }
这里我们使用的是 jobj.k[1]这样的方式,大家一定已经发现了,只要数组中含有键名,当数组被转化为json格式后,就要使用 json对象.键名 这样的方式来访问该键下的元素,上面的例子中,k键下的数组元素是数字索引,所以在json中使用k[1]这样的方式来访问。 下面,我们对数组的第一维和第二维都添加键名: 复制代码 代码如下: <a href="javascript:show("<?php echo urlencode(json_encode(array("k"=>array("a"=>"1","2","3"))));?>")" id="aj">访问json</a> function show(str){ var jobj=eval_r("("+decodeURI(str)+")"); alert(jobj.k.a); }