JSON是什么?
- JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用彻底独立于语言的文本格式,是理想的数据交换格式。同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不须要任何特殊的 API 或工具包。
- RFC: http://www.rfc-editor.org/rfc...
JSON的历史
- 在2001年,JSON被道格拉斯•克罗克福德(Douglas Crockford)建立,并在RFC4627与IETF(因特网工程任务组)标准中被规定;详情见 http://tools.ietf.org/html/rf...。根据规范,JSON的IANA(互联网数字分配机构)媒体类型是application/json,文件类型是json。
- 它基于JavaScript语言,是在JavaScript的数组(array)和对象(object)基础上发展而来;
- 道格拉斯从JS语言中发现的(也能够说是他创造出来的),比当时流行的XML数据传输要优越;
- JSON是语言无关的,支持语言以下
- 8th,ABAP,Ada,AdvPL,ASP,AWK,Bash,BlitzMax,C,C++,C#,Ciao,Clojure,Cobol,ColdFusion,
- D,Dart,Delphi,E,Fantom,FileMaker,Fortran,Go,Groovy,Haskell,Java,JavaScript,LabVIEW,Lisp,LiveCode,LotusScript,LPC,Lua
- M,Matlab,Net.Data,Nim,Objective C,OCaml,PascalScript,Perl,Photoshop,PHP,PicoLisp,Pike,PL/SQL,PowerShell,PureBasic,Puredata,Python,
- R,Racket,Rebol,RPG,Rust,Ruby,Scheme,Squeak,Symbian,Tcl,Visual Basic,Visual FoxPro
json与ajax
- Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种建立交互式网页应用的网页开发技术;
- 虽然 Ajax 先出来了,可是目前先后端的ajax通信几乎都是json格式的了。
json与xml
-
JSON 和 XML的对比php
- 可读性: JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。
- 可扩展性: XML天生有很好的扩展性,JSON固然也有,没有什么是XML能扩展,JSON不能的。
- 编码难度: XML有丰富的编码工具,好比Dom4j、JDom等,JSON也有json.org提供的工具,可是JSON的编码明显比XML容易许多,即便不借助工具也能写出JSON的代码,但是要写好XML就不太容易了。其实手工拼json其实也是个有挑战的活儿
- 解码难度: XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。
- 流行度: XML已经被业界普遍的使用,而JSON才刚刚开始,可是在Ajax这个特定的领域,将来的发展必定是XML让位于JSON。
json与xml互相转换
JSON的格式必须是数组或者对象,其属性支持一下类型:html
- boolean: true, false
- number: 0, 1, 2, 3
- string: "abc"
- object: null, {}, {"a": "b"}
- array: [], [1, 2]
严格的语法约束
json与js
- 由于JSON源于JS,因此JSON在JS中具备得天独厚的优点;
- 由于JS是web环境下B端开发语言的不二之选,因此JSON在WEB中大行其道;
-
优点:node
- JS的语法子集,合法的JSON代码在JS中也是合法的JS代码,内嵌JSON传输随处可见,jsonp的原理即是基于此前提的;
- 解析JSON数据的成本足够小,eval,json.js,
JSON.parse(str)
- 各类封装库直接透传json格式,致使json诞生以后迅速取代xml在数据传输中的地位;
- JSON序列化在JS中也很是容易,json.js,
JSON.stringify(json/*, null, "\t"*/);
eval解析json问题:
var str = "{\"name\":\"value\"}";
// 方法1
var json = eval("(" + str + ")"); // 存在诸如 XSS 攻击风险
// 方法2
var json;
eval("json = " + str);
JSON在其余语言中的序列化问题
- 这里不说解析(反序列化),只要是"合法的"JSON数据,解析库使用的正确,而且两者相匹配,不该该有问题;
- 关于格式化问题:格式化是为了方便调试,生产环境中,应避免使用;
- nodejs: 和浏览器中基本一致;
- PHP: json_encode,json_decode(PHP 5 >= 5.2.0, PECL json >= 1.2.0)
- Ruby:
@json = @data.to_json
, @data = JSON.parse(json)
-
Java:web
JSON与其余语言之间的类型对应关系
json |
js |
php |
ruby |
java |
boolean |
boolean |
boolean |
true,false |
boolean |
number |
number |
integer, float |
Integer, Float |
int, float, double |
string |
string |
string |
String |
String |
array |
Array |
Array |
Array |
[] |
object |
Object |
Array |
Hash |
Object(from class) |
null |
null |
null |
Nil |
null |
数据类型问题为什么如此重要?
- 弱类型语言不表明没有类型
- 最新的JS引擎(V8等),约束类型有利于性能
- 让数据传输协议无歧义,简化约定
- 让两端的代码处理逻辑简化,避免各类异常的问题
- 严格遵照类型约定,能够规避不少容易被忽视的问题
- 想想各类二进制的数据传输协议,类型不是它们特有的
严格来讲,JSON不是JavaScript的子集;
- JSON: 不要误会,我真的不是JavaScript的子集
-
"\u2028
",LINE SEPARATOR,下面的字符被认为是行终止符:json
* `\u000A` - Line Feed
* `\u000D` - Carriage Return
* `\u2028` - Line Separator
* `\u2029` - Paragraph separator
- 正由于这两个不可见的Unicode字符,JSON便不是JavaScript的一个子集了,就差了这么一点点;
JSON的高阶应用
- JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。
- MongoDB底层存储为JSON格式;
- JSONiq是个构建在XQuery之上的新型查询语言。相似于SQL或是LINQ,它提供了诸如let、for、where、group by与select等语法支持概念;
- JSONSelect http://jsonselect.org JSONSelect是一个实验性的JSON选择语言, 她很容易从复杂的JSON文档中访问数据, 看上去就跟CSS同样.
- JSONiq http://www.jsoniq.org JSONiq是一个小型而简洁的XQuery语言扩展来提供JSON支持
- JsonML http://www.jsonml.org JsonML(JSON标记语言)是应用程序的JSON格式. 它使用基本的JSON数据格式机制并将其应用于XML的表示.
- JSON-RPC http://json-rpc.org JSON-RPC是相似于XML-RPC的轻量级远程过程调用(Remote Procedure Call), 它是为简洁而生的.
- JSONLint http://jsonlint.com JSONLint是一个JSON验证器和格式化工具.