当我们在结合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函数对其编码,如:

访问json

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

function show(str){

var jobj=eval_r(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访问呢?我们不防试一试:

访问json

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格式非常重要。有了上面的例子做铺垫,下面站长就直接给出示例代码:

访问json

function show(str){

var jobj=eval_r(decodeURI(str));

alert(jobj[0][0]);

}

大家运行,会发现,这跟一维数组差不多,这是不带键名的例子,因此在show函数中,去掉字符串两端的括号也是可以的。

下面,我们对二维数组进行一下变化,在第二维中加入键名,请看示例代码:

'1',"b"=>'2','3'))));?>')" id="aj">访问json

function show(str){

var jobj=eval_r('('+decodeURI(str)+')');

alert(jobj[0].a);

}

大家运行代码后,发现,这里我们访问json数据的方式有点不一样。上面我们用的是

alert(jobj[0][0]);

而这里我们用的是

alert(jobj[0].a);不要问我为什么,就是这样。这就是json的访问方式。

上面的例子,我们对二维数组的第二维添加了键名,下面我们对第一维添加键名,看看访问方式又有什么不同:

访问json

function show(str){

var jobj=eval_r('('+decodeURI(str)+')');

alert(jobj.k[1]);

}

这里我们使用的是

jobj.k[1]这样的方式,大家一定已经发现了,只要数组中含有键名,当数组被转化为json格式后,就要使用

json对象.键名

这样的方式来访问该键下的元素,上面的例子中,k键下的数组元素是数字索引,所以在json中使用k[1]这样的方式来访问。

下面,我们对数组的第一维和第二维都添加键名:

'1','2','3'))));?>')" id="aj">访问json

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怎么传json数据_php和js如何通过json互相传递数据相关问题探讨相关推荐

  1. 一、vue中当数据在父组件需要给子组件传递数据的时候,子组件输出为undefined

    父组件: <Type :imgList="imgList"/> 子组件: <img :src="imgList[0].imgUrl"/> ...

  2. mysql源生插入数据_php+mysql源生连接数据库和增删改查数据

    php+mysql源生连接数据库和增删改查数据 新建一个init.php文件,执行链接数据库.内容如下 header("Content-type: text/html; charset=ut ...

  3. js某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,请编写一个函数,传入原文,输出密文

    加密规则如下: 每位数字都加上5,然后用除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换 // 定义函数encryptData对数据进行加密 x为形参function encryp ...

  4. js mysql json字符串转数组中_php数据库数据转换为js中的json对象

    / 1.在company数据user表中取出10条数据,保存为数组 2.在将数组转化为json格式,传递给js 3.用json解析器将传递过来的json字符串转化为json对象, 4.用documen ...

  5. JS的传递数据不刷新页面的应用

    以下文章纯是转抄,只因其中有一些东西是要用的,又怕忘掉,所以-.作者看到可不要生气哟! ------------------------- 结合我最近的学习经历.整理一下jsp和js的混合应用的一个方 ...

  6. js中自定义对象、json对象、json字符串、普通js对象

    4.7 自定义对象 JS除了内置对象之外,还允许我们程序自己定义属于我们自己的对象,在JS中自定义对象的方式有2种:通过构造器创建对象,通过初始化器创建对象. 4.7.1 构造器创建对象(原生JS对象 ...

  7. json解析函数c语言,C语言解析json类型数据

    转自:http://buluzhai.iteye.com/blog/845404   首先感谢作者!! 先看json的数据结构 c中没有对象,所以json数据是采用链表存储的 C代码如下: typed ...

  8. JS对象与JSON字符串之间的转换

    JSON - JS中的对象只有JS自己认识,其他的语言都不认识  - JSON就是一个特殊格式的字符串,这个字符串可以被任意的语言所识别, 并且可以转换为任意语言中的对象,JSON在开发中主要用来数据 ...

  9. 在线将JS/JavaScript-Object转JSON工具

    在线将JS/JavaScript-Object转JSON工具 在线将JS/JavaScript-Object转JSON工具 本工具可以将JSON对象转换成Go,支持复制和下载. JSON:(JavaS ...

最新文章

  1. lg gram 笔记本 linux,lg gram 15笔记本使用雨林木风u盘安装win7系统教程?
  2. Win7如何设置多个IP地址
  3. java代码复数包括虚部和实部,Java中编写Applet程序验证复数类(在问题补充中)实现接收用户输入的复数的实部和虚部,计算复数与复数,复数与实数的加减,乘除操作...
  4. 哪种人是软件设计中的稀缺型人才?
  5. (王道408考研数据结构)第四章串-第二节:串的模式匹配算法(朴素和KMP)
  6. Java 私塾面试系列
  7. 大麦无线路由器改装打印服务器,大麦domywifi DW33D路由器固件openwrt重分区版
  8. python写的flappy bird小游戏(最简单版本)有视频链接
  9. mdadm chuck_面向所有人的Python-Chuck博士提供的14小时免费Python课程
  10. 百果园app系统开发b2c模式详解
  11. js获取传统节假日_js 两个时间之间工作日的计算问题(包含节假日)
  12. 了解CI/CD流水线
  13. matlab绘制垂线(x轴或y轴)
  14. Java、JSP研究生导师信息管理系统设计
  15. 在mysql中如何建立性别约束_在Access2010数据库中,要在表中建立“性别”字段,并按与要求用逻辑值表示,其数据类型应当是()_学小易找答案...
  16. 使用acmesh免费开启https(详细概念介绍与操作步骤记录)
  17. Latex CJK,tex使用中文
  18. linux三国志11,《三国志11》南明、南宋、五胡十六国、光武中兴MOD推荐
  19. linux 下载文件到本地
  20. 单片机实验三(1):中断处理,定时器

热门文章

  1. 根据id获取多维数组路径_程序员的进阶课-架构师之路(2)-数组
  2. python学生管理系统类图_类图 python
  3. php mysql 随机字符串_MySQL_Mysql 自定义随机字符串的实现方法,前几天在开发一个系统,需要 - phpStudy...
  4. 打砖块小游戏php程序,利用原生js实现html5打砖块小游戏(代码示例)
  5. 关于前端设置cookie
  6. 一致性哈希算法原理分析及实现
  7. js页面传值(注意中文)
  8. JQUERY操作html--获取和设置内容、属性、回调函数
  9. $(document).ready() 和 window.onload 方法比较
  10. PAT 1074. Reversing Linked List (25)