原文(本人原创):
学习资料:
目录:
JavaScript对象表示法(JavaScript Object Notation,JSON)由Douglas Crockford于2001年提出,已经成为RESTful接口设计中的事实标准,JSON数据格式使得应用程序可以通过RESTful API等方式在网络上进行数据通信,架构师和开发人员可以使用一整套现成的技术生态系统(鲜为人知的标准、工具和相关技术)来搭建设计精巧的应用程序。
JSON非常简单,由对象、数组、键值对这三种开发人员熟悉的结构体所组成。除了表现层状态转化(REpresentational State Transfer,REST),JSON在Node.js、MongoDB等NoSQL数据库、Kafka等消息平台等环境中也有应用。对于设计或实现Web移动端应用程序、RESTful API以及消息系统的架构师和开发人员,JSON都是有必要学习和研究的内容。
JSON不局限于某项技术,本身非私有,且可移植。对于产生(序列化)和读取(反序列化)JSON数据,绝大多数主流的现代编程语言和平台都可以提供优秀的JSON支持,如JavaScript、Ruby、Java、Groovy、Go、Scala、Perl、PHP、Python、Clojure、C#等等。
JSON是JavaScript对象字面量表示法的一个子集,因此可以无缝的与JavaScript开发融为一体。而JSON不仅仅是Ajax调用中XML的一个简单的替代品,它也日益成为互联网数据交换领域的骨干元素。严谨的标准和技术最佳实践加上对JSON的喜爱,有利于搭建一个真正优雅、有用而又高效的应用程序。事实上,现在能够用XML实现的功能都可以(也应当)用JSON实现。
JSON非常简洁,并且正在逐步替代XML成为互联网上主要的数据交换格式。它易于阅读,相关结构也很容易与软件开发人员所熟悉的概念对应起来,例如数组、对象和键值对。我们不用再挠头苦思某个东西应当是元素还是属性,也不用就这一点与人争论不休。与XML相比,对象及其数据成员这一组合更适合面向对象的设计和开发。由于节省了每个元素的开始标签与结束标签,JSON格式的额外开销更少、更为紧凑,所以JSON格式的文档一般比XML文档小。从企业级应用角度来看,与XML相比,JSON文档在网络上传递与处理更快,因此效率更高。
虽然JSON被设计为一种数据交换格式(通常用于REST),但如今JSON在配置文件中也占有一席之地,如Node.js和SublimeText等广泛应用的。Node.js使用package.json文件来定义其标准的npm包结构;SublimeText作为Web开发社区一款流行IDE,使用JSON来配置外观和包管理器。
总而言之,JSON广泛流行的主要原因有:
创始人Douglas Crockford认为JSON核心标准不会有新的版本,开发社区有新需要时,新的数据格式将直接替代JSON。
事实上,JSON标准唯一化的目的是避免支持早期版本而在向后兼容的时候遇到陷阱(哪怕当前不是那么完美)。
然而,“无版本”的理念仅适用于JSON核心数据格式,有些标准是JSON社区中其他人员提出的。
⬆ TOP
这里基于jslint工具校验JSON格式。
{
"description": "hello, json!"
}
[
"also",
"a",
"valid",
"JSON",
"doc"
]
⬆ TOP
JSON有六种数据类型:
{}
):键值对的无序集合[]
):值的有序集合""
)true
或 false
)null
)JSON本质上在键值对中存储数据,键值对中的数据用逗号(,
)分隔,Key与Value之间用冒号(:
)分隔。
每一个键名(如"name")应该位于冒号(:)左边,而每一个键值(如"小明")位于冒号的右边。
{
"name": "小明",
"ID": "123456",
"University": "Zhejiang University"
}
JSON对象由键值对组成,具有以下特征:
{
和右大括号}
括起来{}
一个普通的JSON对象:
{
"address" : {
"line1" : "555 Any Street",
"city" : "Denver",
"stateOrProvince" : "CO",
"zipOrPostalCode" : "80202",
"country" : "USA"
}
}
一个带有内嵌数组的JSON对象:
{
"speaker" : {
"firstName" : "Larson",
"lastName" : "Richard",
"topics" : ["JSON", "REST", "SOA"]
}
}
一个内嵌其他JSON对象的JSON对象:
{
"speaker" : {
"firstName" : "Larson",
"lastName" : "Richard",
"topics" : ["JSON", "REST", "SOA"],
"address" : {
"line1" : "555 Any Street",
"city" : "Denver",
"stateOrProvince" : "CO",
"zipOrPostalCode" : "80202",
"country" : "USA"
}
}
}
JSON数组具有以下特征:
[
和右中括号]
括起来[]
一个内嵌其他对象和数组的数组:
{
"speakers": [
{
"firstName" : "Larson",
"lastName" : "Richard",
"topics" : ["JSON", "REST", "SOA"],
"address" : {
"line1" : "555 Any Street",
"city" : "Denver",
"stateOrProvince" : "CO",
"country" : "USA"
}
},
{
"firstName" : "Tom",
"lastName" : "Green",
"topics" : ["JSON", "REST", "SOA"],
"address" : {
"line1" : "Fifth Avenue",
"city" : "New York",
"stateOrProvince" : "New York",
"country" : "USA"
}
}
]
}
JSON字符串具有以下特征:
''
:双引号\\
:反斜杠\/
:斜杠\b
:退格\f
:换页\n
:换行\r
:回车\t
:Tab制表符\u
:后跟4位十六进制数字(表示一个Unicode字符)[
"fred",
"fred\t",
"\b",
"",
"\t",
"\u004A"
]
JSON数值具有以下特征:
{
"age" : 29,
"cost" : 299.99,
"temperature" : -10.5,
"unitPrice" : 0.2,
"speedOfLight1" : 1.23E11,
"speedOfLight2" : 1.23e+11,
"avogadro1" : 6.023e23,
"avogadro2" : 6.023E+23,
"oneHundredth" : 10e-3,
"ontTenth" : 10E-2
}
JSON布尔值存在以下特征:
{
"isRegistered" : true,
"emailValidated" : false
}
严格意义上讲,null并不是一种类型,而是JSON中的一个特数值,表示数据缺失或无意义。
null具有以下特征:
{
"address" : {
"line1" : "555 Any Street",
"line2" : null,
"city" : "Denver",
"stateOrProvince" : "CO",
"zipOrPos