开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2373|回复: 15
收起左侧

[js/PHP求助] JavaScript:根本没有“JSON对象”这回事!

[复制链接]

发表于 2013-2-21 22:58:41 | 显示全部楼层 |阅读模式   北京市北京市
本文的主题是基于ECMAScript262-3来写的,2011年的262-5新规范增加了JSON对象,和我们平时所说的JSON有关系,但是不是同一个东西,文章最后一节会讲到新增加的JSON对象。



写这篇文章的目的是经常看到开发人员说:把字符串转化为JSON对象,把JSON对象转化成字符串等类似的话题,所以把之前收藏的一篇老外的文章整理翻译了一下,供大家讨论,如有错误,请大家指出,多谢。
本文的主题是基于ECMAScript262-3来写的,2011年的262-5新规范增加了JSON对象,和我们平时所说的JSON有关系,但是不是同一个东西,文章最后一节会讲到新增加的JSON对象。
英文原文:http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/
我想给大家澄清一下一个非常普遍的误解,我认为很多JavaScript开发人员都错误地把JavaScript对象字面量(Object Literals)称为JSON对象(JSON Objects),因为他的语法和JSON规范里描述的一样,但是该规范里也明确地说了JSON只是一个数据交换语言,只有我们将之用在string上下文的时候它才叫JSON。
序列化与反序列化
2个程序(或服务器、语言等)需要交互通信的时候,他们倾向于使用string字符串因为string在很多语言里解析的方式都差不多。复杂的数据结构经常需要用到,并且通过各种各样的中括号{},小括号(),叫括号<>和空格来组成,这个字符串仅仅是按照要求规范好的字符。
为此,我们为了描述这些复杂的数据结构作为一个string字符串,制定了标准的规则和语法。JSON只是其中一种语法,它可以在string上下文里描述对象,数组,字符串,数字,布尔型和null,然后通过程序间传输,并且反序列化成所需要的格式。YAML和XML(甚至request params)也是流行的数据交换格式,但是,我们喜欢JSON,谁叫我们是JavaScript开发人员呢!
字面量
引用Mozilla Developer Center里的几句话,供大家参考:
◆ 他们是固定的值,不是变量,让你从“字面上”理解脚本。 (Literals)
◆ 字符串字面量是由双引号(")或单引号(')包围起来的零个或多个字符组成的。(Strings Literals)
◆ 对象字面量是由大括号({})括起来的零个或多个对象的属性名-值对。(Object Literals)
何时是JSON,何时不是JSON?
JSON是设计成描述数据交换格式的,他也有自己的语法,这个语法是JavaScript的一个子集。
{ "prop": "val" } 这样的声明有可能是JavaScript对象字面量也有可能是JSON字符串,取决于什么上下文使用它,如果是用在string上下文(用单引号或双引号引住,或者从text文件读取)的话,那它就是JSON字符串,如果是用在对象字面量上下文中,那它就是对象字面量。

    // 这是JSON字符串  
  • var foo = '{ "prop": "val" }';  
       
  • // 这是对象字面量  
  • var bar = { "prop": "val" };
而且要注意,JSON有非常严格的语法,在string上下文里{ "prop": "val" } 是个合法的JSON,但{ prop: "val" }和{ 'prop': 'val' }确实不合法的。所有属性名称和它的值都必须用双引号引住,不能使用单引号。另外,即便你用了转义以后的单引号也是不合法的,详细的语法规则可以到这里查看
放到上下文里来看
大家伙可能嗤之以鼻:难道JavaScript代码不是一个大的字符串?
当然是,所有的JavaScript代码和HTML(可能还有其他东西)都是字符串,直到浏览器对他们进行解析。这时候.jf文件或者inline的JavaScript代码已经不是字符串了,而是被当成真正的JavaScript源代码了,就像页面里的innterHTML一样,这时候也不是字符串了,而是被解析成DOM结构了。
再次说一下,这取决于上下文,在string上下文里使用带有大括号的JavaScript对象,那它就是JSON字符串,而如果在对象字面量上下文里使用的话,那它就是对象字面量。
真正的JSON对象
开头已经提到,对象字面量不是JSON对象,但是有真正的JSON对象。但是两者完全不一样概念,在新版的浏览器里JSON对象已经被原生的内置对象了,目前有2个静态方法:JSON.parse用来将JSON字符串反序列化成对象,JSON.stringify用来将对象序列化成JSON字符串。老版本的浏览器不支持这个对象,但你可以通过json2.js来实现同样的功能。
如果还不理解,别担心,参考一下的例子就知道了:

    // 这是JSON字符串,比如从AJAX获取字符串信息  
  • var my_json_string = '{ "prop": "val" }';  
       
  • // 将字符串反序列化成对象  
    var my_obj = JSON.parse( my_json_string );  
  •    
    alert( my_obj.prop == 'val' ); //  提示 true, 和想象的一样!  
  •    
    // 将对象序列化成JSON字符串  
  • var my_other_json_string = JSON.stringify( my_obj );
另外,Paul Irish提到Douglas Crockford在JSON RFC里用到了“JSON object”,但是在那个上下文里,他的意思是“对象描述成JSON字符串”不是“对象字面量”。


 楼主| 发表于 2013-2-22 00:09:09 | 显示全部楼层   内蒙古自治区呼和浩特市
小岩锅锅 发表于 2013-2-21 23:00
http://bbs.125.la/e3600-duihuan.html UID:117014  请转给我40交易币 我给你1000精币 我有急用

小岩蝈蝈,说好的给2000,才收到1891   {:soso_e109:}     100多个精币呢,坑爹啊,给个好评抚慰一下我受伤的心灵吧。。。。。{:soso_e109:}{:soso_e109:}{:soso_e109:}{:soso_e109:}   好评   好评   好评   
QQ截图20130222000528.png
回复 支持 反对

使用道具 举报

结帖率:100% (11/11)
发表于 2013-2-22 00:02:45 | 显示全部楼层   河北省衡水市
ljmst 发表于 2013-2-21 23:59
好了,小岩蝈蝈,转给你了,请付钱哈

不介意的话 剩下6个  是不是也
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-2-22 00:02:05 | 显示全部楼层   内蒙古自治区呼和浩特市
小岩锅锅 发表于 2013-2-21 23:59
转账后最低余额 50 枚
积分交易税 3.00%  只给了你1950   如果你不介意  剩下的6个交易币...

我很介意,你少给了额50
回复 支持 反对

使用道具 举报

结帖率:100% (11/11)
发表于 2013-2-21 23:59:17 | 显示全部楼层   河北省衡水市
本帖最后由 小岩锅锅 于 2013-2-22 00:00 编辑
ljmst 发表于 2013-2-21 23:50
好吧,稍等

转账后最低余额 50 枚
积分交易税 3.00%  只给了你1950   如果你不介意  剩下的6个交易币...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-2-21 23:59:00 | 显示全部楼层   内蒙古自治区呼和浩特市
小岩锅锅 发表于 2013-2-21 23:47
http://bbs.125.la/e3600-duihuan.html UID:117014

好了,小岩蝈蝈,转给你了,请付钱哈
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-2-21 23:50:53 | 显示全部楼层   内蒙古自治区呼和浩特市
小岩锅锅 发表于 2013-2-21 23:49
2000精币换40交易币  你还在等什么

好吧,稍等
回复 支持 反对

使用道具 举报

结帖率:100% (11/11)
发表于 2013-2-21 23:49:34 | 显示全部楼层   河北省衡水市
ljmst 发表于 2013-2-21 23:49
你自己难道没法提现吗?

  2000精币换40交易币  你还在等什么
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-2-21 23:49:02 | 显示全部楼层   江苏省泰州市
小岩锅锅 发表于 2013-2-21 23:46
骗你干叼

你自己难道没法提现吗?
回复 支持 反对

使用道具 举报

结帖率:100% (11/11)
发表于 2013-2-21 23:47:16 | 显示全部楼层   河北省衡水市
ljmst 发表于 2013-2-21 23:45
真的假的

http://bbs.125.la/e3600-duihuan.html UID:117014  
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表