当我们在结合php和javascript实现某些功能时,经常会用到json。json是js的一种数据格式,可以直接被js解析。而php无法直接读取json数据,但是php提供了json_decode函数来对json数据进行转化,从而可以被php脚本访问。同时,php也提供了json_encode函数来将数据转化成json格式。那么,js中的原生json与php中通过json_encode函数转化后的json是否完全一样呢?今天,一起来探讨这个问题。

我们通过php向javascript传递数组数据时,通常要将其转化为json格式,使用javascript来获取,那么我们就以数组为例,先来看一下两者之间的区别。

1、一维数组

考虑php数组 $array=array("1","2","3");  使用json_encode函数转化后,对应的json字符串为["1","2","3"]。

细心的朋友很快就发现,转化后得到的json字符串,就是javascript中的数组形式,那么是否可以用js的数组访问方式来访问呢?

当然是可以的,但是你将这个json字符串传递给给js时,需要使用urlencode函数对其编码,如:

<a href="javascript:show('<?php echo urlencode(json_encode(array('1','2','3')));?>')" id="aj">访问json</a>

我们可以用下面的js代码来验证:

function show(str){
  var jobj=eval(decodeURI(str));
  alert(jobj[2]);
}

大家自己试一试就会发现,是的,可以用js中访问一维数组的方式来访问它。eval方法将json字符串解释为json对象,因为传递过来的是字符串,不转化的话,你得到将是字符串中第三个字符的值。

我们再来对这个一维数组做一下变化,我们发现上面的一维数组没有指定索引,所以它默认为数字索引,现在我们来给它加上键名:

考虑php数组$array=array('a'=>'1','b'=>'2','c'=>'3');使用json_encode函数转化后,对应的json字符串为{"a":"1","b":"2","c":"3"}

我们很快就发现了其中的不同,最明显的就是字符串两端的[]变成了{},那么这个字符串是否也可以按上面那样处理后被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(decodeURI(str));
  alert(jobj.a);
}

大家如果动手试了就知道,点击链接后,没有出现弹窗。为什么呢?是PHP生成的json字符串格式不对吗?不是的,这是我们在使用eval函数解释的时候,出错了。把上面的函数代码换成:

function show(str){
  var jobj=eval('('+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(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('('+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('('+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);
}

正如上面所提到的,只要含有键名,就必须以json对象.键名的方式来访问,如果有多个键就要用json对象.键名.键名...,不要问我为什么,这就是json的访问方式,只有javascript的发明者能向你解释,他为什么要这样规定。

结论:

1、将php中的数组转化为json字符串传递给js时。如果数组没有指定键名,那么可以直接使用js的eval方法将其转化为json格式供js处理;如果数组中含有键名,那么在使用eval方法处理时,需要使用()将json字符串括起来。

2、如果数组中含有键名,转化为json字符串后,在js中要用json对象.键名.键名...的方式来访问,如果是数字索引则用json对象[1]或者json对象.键名[1]这样的方式。

上面,我们主要讨论了,在PHP向js传递json字符串时,需要注意的事项。下面我们再来讨论,用js向php传递json字符串时需要如何处理。

聪明的你肯定已经知道了,只要将json数据用引号引起来作为字符串传递给PHP【通常用ajax进行】就可以用json_decode函数解码了。没错!就是这样!但是在构造json字符串的时候一定要仔细,如果你不经常构造json字符串,那么不妨用echo json_encode(array('k'=>array("a"=>'1','2','3')))这样的方式,查看你需要构造的目标字符串的json格式。这样你就可以在js中根据你想要的结果来构造了!

好了,今天对php和js之间如何使用json数据进行通信就讨论到这里,大家可以自己再试试将php的对象类型进行json编码后如何传递给js。

php和js如何通过json互相传递数据的更多相关文章

  1. JS基础语法---JSON格式的数据

         1. 对象: 有属性和方法,特指的某个事物     对象: 一组无序属性的集合的键值对,属性的值可以是任意的类型   2.JSON格式的数据:一般都是成对的,是键值对,     json也是 ...

  2. springMVC和json结合传递数据

    1. 新建web project 2. 增加jar 3. 改写web.xml <?xml version="1.0" encoding="UTF-8"?& ...

  3. C#开发的WebService使用JSON格式传递数据+Ajax测试

    [C#]  WebService 使用 JSON 格式傳遞筆記 + JQuery 測試 0 2 因為一些因素,必須改寫WebService,很傳統,但是很多公司還在用.. 因為XML 的關係,不想讓他 ...

  4. 9.SpringMVC和json结合传递数据 && 10.SpringMVC获取controller中json的数据

  5. 浅谈JSON与与JS相关的JSON函数

    本文内容主要引用在微信公众号上看到的一片文章,因为自己对Json了解不是很深入,所以就整理出这篇博文与大家分享! 一. JSON是一种格式,基于文本,优于轻量,用于交换数据 1.一种数据格式 数据的传 ...

  6. react在router中传递数据的2种方法

    概述 不传递数据叫什么单页面应用,渲染模块还需要http请求算什么单页面应用. 本文总结了react-router4中使用BrowserRouter时传递数据的两种方法,供以后开发参考,相信对其他人也 ...

  7. 转载 ----HTML5 ---js实现json方式提交数据到服务端

    json提交给服务器我们在提交之前需要通过js的相关函数来把数据转换成json格式的数据再进行post或get了,下面来看看.   大概需求就是前端要把数据组装成json,传给后端.首先,在客户端,通 ...

  8. Django:之传递数据给JS、Ajax和Ajax CSRF认证

    Django传递数据给JS 有时候我们想把一个list或者dict传递给javascript,处理后显示到网页上,比如要用js进行可视化到数据. 请注意:如果是不处理,直接显示在网页上,用Django ...

  9. json进阶(一)js读取解析JSON类型数据

    js读取解析JSON类型数据 一.什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式,同 ...

随机推荐

  1. 【转】家庭wifi覆盖指导

    网址:家庭wifi覆盖指导 私以为,目前民用 wifi 路由器市场已经完全走上了邪路.天线越来越大,发射功率越做越高.都敢冒着法律的风险使用大大超过 100mW 的发射功率了.且不论巨大的发射功率可能 ...

  2. supervisord 小记

    此篇仅用作supervisord的用法,不涉及理论说明和基础介绍 supervisor(一)基础篇 使用supervisord来管理process 进程的守护神 - Supervisor superv ...

  3. 解决Cannot delete or update a parent row: a foreign key constraint fails (`current_source_products`.`product_storage`, CONSTRAINT `product_storage_ibfk_3` FOREIGN KEY (`InOperatorID`)

    出现这个异常的原因是因为设置了外键,造成无法更新或删除数据. 1.通过设置FOREIGN_KEY_CHECKS变量来避免这种情况 删除前设置 SET FOREIGN_KEY_CHECKS=0; 删除完 ...

  4. listview优化技术

    1.在adapter中的getView方法中尽量少使用逻辑 2.尽最大可能避免GC 3.滑动的时候不加载图片 4.将ListView的scrollingCache和animateCache设置为fal ...

  5. 【php学习】PHP 入门经典第二章笔记

    问题答疑: 1.默认情况下,Apache服务器的配置文件名.MySQL服务器的配置文件名以及PHP预处理器配置文件名分别是什么?Apache默认主配置文件:根目录下config文件夹下httpd.co ...

  6. (整理) Json语法规则

    { "staff":[ {"name":"haha1", "age":20}, {"name":&q ...

  7. JS 设计模式

    1.单例模式:产生一个类的唯一实例 例如:我们在页面中添加遮罩层,每次只能有一个遮罩层存在,因此为单例模式. 在创建遮罩层之前判断是否已经存在,若没有存在,则创建. 这里使用闭包,将是mask变量封装 ...

  8. PHP memcache 安装问题

    第一步:下载  memcached.exe 第二步:c:\window\system32\cmd.exe  管理员启动 第三步: memcached.exe -d start (错误) failed ...

  9. mysql 完整性约束

    mysql 完整性约束 数据的完整性概述根据完整性实施的方法将完整性约束分为四类:1.实体完整性 实体完整性的实现:通过在表中设置主键约束.唯一约束或标识列来实现 主键约束:应用于表列的一个约束 用法 ...

  10. printf函数

    printf函数的格式及含义 d                    以十进制带符号的形式输出整数(对正数不输出符号) o                    以八进制无符号的形式输出整数(不输出 ...