> 原文出处:http://codecloud.net/core-json-tutorial-6735.html
> 本文由[程序员的资料库技术翻译小组](http://codecloud.net/tech-article-translate-6591.html)翻译,如有错误请帮忙更正,谢谢支持。
>
> 英文原文:[Core JSON](https://dzone.com/refcardz/core-json)
>
> 欢迎转载,转载请务必保留译文出处和原文出处,谢谢合作!
[JSON(JavaScript Object Notation)](http://w3cschool.codecloud.net/json/what-is-json.html)是一种基于文本的标准数据交换格式,使应用程序通过计算机网络交换数据。因为JSON独立于编程语言和计算平台,因此用Ruby ,[Java](http://w3cschool.codecloud.net/java/java-hello-world.html)/EE,Javascript,C#/.Net,PHP等编程语言写的程序,可以很容易的消耗和产生JSON数据。而与JSON相关的API和工具十分丰富,这让你很容易的将JSON运用在你喜爱的编程语言,IDE 和运行环境里。此外,流行的NoSQL数据库,诸如MongoDB和ConchBase,都是基于JSON的。
在2001年,JSON被道格拉斯•克罗克福德创建,并在RFC4627与IETF(因特网工程任务组)标准中被规定;详情见 http://tools.ietf.org/html/rfc4627。根据规范,JSON的IANA(互联网数字分配机构)媒体类型是应用/json,文件类型是json。
## 什么是JSON?
JSON是一种简单的数据格式,它有三种基本的数据结构:
* 键/值对。
* 对象。
* 数组。
有效的JSON文件总是被大括号围绕,像这样:
~~~
{ JSON-Data }
~~~
请注意,JSON社区的一些成员使用术语“字符串”而不是“文档”来描述JSON 。
## 为什么要用JSON?
在因特网上,JSON正逐渐代替XML成为首选的数据交换格式,这是因为JSON容易阅读并且它的结构匹配常见的编程概念,诸如对象和数组。JSON也比XML更高效(即更快的解析和网络传输),这是因为JSON更紧凑——没有开始和结束标签。
### 键/值对
键/值对看起来像这样:
~~~
{
"firstName": "John"
}
~~~
属性名(即第一个名字)是被双引号环绕的字符串。值可以是字符串(如上面的例子),但这仅是有效数据类型中的一组。(请查看数据类型章节获取更多细节。)一些著名的科技公司申称他们使用JSON数据格式,但是他们并不用引号环绕他们的字符串。然而,这不是有效的JSON;请查看JSON验证章节获得更多信息。
### 对象
对象是无序键/值对的集合。下面的例子展示了一个地址对象:
~~~
{
"address" : {
"line1" : "555 Main Street",
"city" : "Denver",
"stateOrProvince" : "CO",
"zipOrPostalCode" : "80202",
"country" : "USA"
}
}
~~~
对象(这里是指地址)被环绕在大括号里,由一对对被逗号分割的键/值对组成。
### 数组
数组是有序值的集合,数组看起来像这样:
~~~
{
"people" : [
{ "firstName": "John", "lastName": "Smith", "age": 35 },
{ "firstName": "Jane", "lastName": "Smith", "age": 32 }
]
}
~~~
### 值类型
值(即键/值对右手边的)可以是下列任一类型:
* 对象
* 数组
* 字符串
* 数字
* 布尔值
* null
数字 数字可以是整数或者双精度浮点型。这里有一些例子: “age”: 29
~~~
"cost": 299.99
"temperature": -10.5
"speed_of_light": 1.23e11
"speed_of_light": 1.23e+11
"speed_of_light": 1.23E11
"speed_of_light": 1.23E+11
~~~
属性名(如age等)是被双引号环绕的字符串,但是值没有引号。数字可以有负号。紧跟在数值后面的指数部分(记作e或E),可以选择正负号。将0,八进制放在数值前是不被允许的,十六进制同样不被允许 。
### 布尔值
在JSON里,布尔值要么是真,要么是假,如下:
~~~
{
"emailValidated" : true
}
~~~
属性名(emailVaild)是被双引号环绕的字符串,但是值(true)没有引号。
### null
虽然从技术层面上说null不是一个数据类型,它是一个特殊的值,可以用来表示数据元素没有值。在下面的例子里, 年龄的作用域没有值(也许是因为用户选择不填写这个信息):
~~~
{
"age" : null
}
~~~
### 注释
JSON不允许有注释。注释原本是JSON的一部分,但是开发者将解析指令放入注释中,这极大地滥用了它们。当道格拉斯•克罗克福德看见开发者如此实践时,他从JSON里移除了注释,以此保持计算机平台的互操作性。
### 样式
也许你已经注意到属性名(及冒号的左边)使用了驼峰命名法。这不是一个准则或者标准,但是一个约定俗称的规定,这个规定被写在在谷歌的JSON样式指南里: http://google-styleguide.googlecode.com/svn/trunk/jsoncstyleguide.xml.
### 官方语法
道格拉斯•克罗克福德的JSON网站(http://www.json.org)提供了JSON语法的完整描述。
此外,JSON Pro Quick Guide (在iphone苹果商店里可免费获取)提供了样例和JSON语法的概述。