JSON
此條目需要补充更多来源。 (2017年5月11日) |
JSON(JavaScript Object Notation,JavaScript物件表示法,读作/ˈdʒeɪsən/)是一種由道格拉斯·克羅克福特構想和設計、輕量級的資料交換語言,该语言以易於讓人閱讀的文字為基礎,用来传输由属性值或者序列性的值组成的数据对象。儘管JSON是JavaScript的一個子集,但JSON是獨立於語言的文本格式,並且採用了類似於C語言家族的一些習慣。
扩展名 |
.json |
---|---|
互联网媒体类型 |
application/json |
类型代码 | TEXT |
统一类型标识 | public.json |
格式类型 | 数据交换 |
扩展自 | JavaScript |
标准 | RFC 7159, ECMA-404 |
网站 | json |
JSON 数据格式与语言无关。即便它源自JavaScript,但目前很多编程语言都支持 JSON 格式数据的生成和解析。JSON 的官方 MIME 类型是 application/json
,文件扩展名是 .json
。
簡介
JSON格式是1999年《JavaScript Programming Language, Standard ECMA-262 3rd Edition》的子集合,所以可以在JavaScript以eval()
函式(javascript通过eval()调用解析器)读入。不过这并不代表JSON无法使用于其他语言,事实上几乎所有与网络开发相关的语言都有JSON函式库。
JSON的基本数据类型:
- 数值:十进制数,不能有前导0,可以为负数,可以有小数部分。还可以用
e
或者E
表示指数部分。不能包含非数,如NaN。不区分整数与浮点数。JavaScript用双精度浮点数表示所有数值。 - 字串:以双引号
""
括起来的零个或多个Unicode码位。支持反斜杠开始的转义字符序列。 - 布尔值:表示为
true
或者false
。 - 陣列:有序的零个或者多个值。每个值可以为任意类型。序列表使用方括号
[
,]
括起来。元素之间用逗号,
分割。形如:[value, value]
- 物件:若干无序的“键-值对”(key-value pairs),其中键是数值或字符串。建议但不强制要求对象中的键是独一无二的。对象以花括号
{
开始,并以}
结束。键-值对之间使用逗号分隔。键与值之间用冒号:
分割。 - 空值:值写为
null
token(6种标点符号、字符串、数值、3种字面量)之间可以存在有限的空白符并被忽略。四个特定字符被认为是空白符:空格符、水平制表符、回车符、换行符。空白符不能出现在token内部(但空格符可以出现在字符串内部)。JSON标准不允许有字节序掩码,不提供注释的句法。 一个有效的JSON文档的根节点必须是一个对象或一个数组。
JSON交换时必须编码为UTF-8。[1]转义序列可以为:“\\”、“\"”、“\/”、“\b”、“\f”、“\n”、“\r”、“\t”,或Unicode16进制转义字符序列(\u后面跟随4位16进制数字)。对于不在基本多文種平面上的码位,必须用UTF-16代理对(surrogate pair)表示,例如对于Emoji字符——喜極而泣的表情(U+1F602 😂 FACE WITH TEARS OF JOY)在JSON中应表示为:
{ "face": "😂" }
// or
{ "face": "\uD83D\uDE02" }
JSON的格式描述可以參考RFC 4627。
应用领域
WEB开发
JSON最开始被广泛的应用于WEB应用的开发。不過目前JSON使用在JavaScript、Java、Node.js應用的情況比較多,PHP、C#等開發的WEB應用主要還是使用XML。
NoSQL数据库
相对于传统的关系型数据库,一些基于文档存储的NoSQL非关系型数据库选择JSON作为其数据存储格式,比较出名的产品有:MongoDB、CouchDB、RavenDB等。
举例
{
"firstName": "John",
"lastName": "Smith",
"sex": "male",
"age": 25,
"address":
{
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
},
"phoneNumber":
[
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
]
}
这种JSON格式也被不少游戏(如Minecraft)或應用軟體用来当作的部分数据存储的格式:
[
{
"text": "This is the text",
"color": "dark_red",
"bold": "true",
"strikethough": "true",
"clickEvent":
{
"action": "open_url",
"value": "zh.wikipedia.org"
},
"hoverEvent":
{
"action": "show_text",
"value":
{
"extra": "something"
}
}
},
{
"translate": "item.dirt.name",
"color": "blue",
"italic": "true"
}
]
安全問題
读取JSON
由於JSON是JavaScript的子集,所以一般都會使用eval()
作為讀取資料的方式,如果是针对可靠的数据来源,在不支持原生JSON解析的浏览器上面这是最快速的方法。然而由于eval方法同样可以执行任意的JavaScript代码,因此当数据来源不可靠时则可能产生安全问题。如下面的例子,直接用eval执行时会跳转:
var json= eval("{message:(function (){ window.location='http://zh.wikipedia.org/wiki/JSON#.E5.AE.89.E5.85.A8.E6.80.A7.E5.95.8F.E9.A1.8C'; })()}");
其中一種防止不安全程式碼出現的解決辦法,是通过浏览器原生支持的JSON.parse(str)
方法讀取JSON資料,目前已经得到大部分主流浏览器的支持(IE8+,Firefox 3.5+,Chrome4+/Safari4+,Opera10+),在不支持原生JSON对象的浏览器上面可以使用parseJSON
方法进行读取[2],parseJSON
採用解析器驗證讀入的程式碼是否真的是JSON程式碼,這樣就更安全。但由於這是用模擬的方式讀取,速度上會比eval()
慢。
跨站存取問題
另外一個安全上的問題則是跨站請求偽造(Cross-site request forgery,簡稱CSRF或XSRF)。這個問題在Javascript中的狀況是,由於Javascript採用了稱為「沙盒」的機制,這種機制限制Javascript引擎僅能引入同一個站點的程式碼,因而某種程度上提高了安全性。
與其他格式的比較
XML
JSON與XML最大的不同在於XML是一個完整的標記語言,而JSON不是。這使得XML在程式判讀上需要比較多的功夫。主要的原因在於XML的設計理念與JSON不同。XML利用標記語言的特性提供了絕佳的延展性(如XPath),在数据存储,扩展及高级检索方面具备对JSON的优势,而JSON则由于比XML更加小巧,以及浏览器的内建快速解析支持,使得其更适用于网络数据传输领域。
MessagePack
MessagePack宣称比JSON更短小,快速。
格式化工具
JSON格式取代了XML给网络传输带来了很大的便利,但是却没有了XML的一目了然,尤其是JSON数据很长的时候,会让人陷入繁琐复杂的数据节点查找中。开发者可以通过在线JSON格式化工具,来更方便的对JSON数据进行节点查找和解析。
參考文獻
- ^ The JavaScript Object Notation (JSON) Data Interchange Format. IETF. December 2017 [16 February 2018].
- ^ JSON and Browser Security.
參見
外部連結
- (英文) JSON(页面存档备份,存于互联网档案馆),關於JSON的規格、文件,以及在其他語言實做的資訊
- JSON中文说明
- (英文) RFC 4627,JSON在RFC裡的規格
- JSON格式化工具 (中文)
- JSON编辑器
- JSON分析器(页面存档备份,存于互联网档案馆)
- JSON到CSV转换器
- Minecraft指令─JSON文字格式
- JSON在线格式化工具