JSON





body.skin-minerva .mw-parser-output table.infobox caption{text-align:center}





































JSON

JSON vector logo.svg
扩展名
.json

互联网媒体类型

application/json
类型代码英语Type code
TEXT
统一类型标识
public.json
格式类型
数据交换
延伸自
JavaScript
标准
RFC 7159, ECMA-404
网站
json.org

JSONJavaScript Object Notation,JavaScript物件表示法)是一種由道格拉斯·克羅克福特構想和設計、輕量級的資料交換語言,该语言以易於讓人閱讀的文字為基礎,用来传输由属性值或者序列性的值组成的数据对象。儘管JSON是JavaScript的一個子集,但JSON是獨立於語言的文本格式,並且採用了類似於C語言家族的一些習慣。


JSON 数据格式与语言无关,脱胎自JavaScript,但目前很多编程语言都支持 JSON 格式数据的生成和解析。JSON 的官方 MIME 类型是 application/json,文件扩展名是 .json




目录






  • 1 簡介


  • 2 应用领域


    • 2.1 WEB开发


    • 2.2 NoSQL数据库




  • 3 举例


  • 4 安全問題


    • 4.1 读取JSON


    • 4.2 跨站存取問題




  • 5 與其他格式的比較


    • 5.1 XML


    • 5.2 MessagePack


    • 5.3 格式化工具




  • 6 參考文獻


  • 7 參見


  • 8 外部連結





簡介


JSON格式是1999年《JavaScript Programming Language, Standard ECMA-262 3rd Edition》的子集合,所以可以在JavaScript以eval()函式(javascript通过eval()调用解析器)读入。不过这并不代表JSON无法使用于其他语言,事实上几乎所有与网页开发相关的语言都有JSON函式库。


JSON用于描述资料结构,有两种结构存在:



  • 对象(object):一个对象包含一系列非排序的名称/值对(pair),一个对象以{开始,并以}结束。每个名称/值对之间使用:分割。

  • 数组 (array):一个数组是一个值(value)的集合,一个数组以[開始,并以]结束。数组成員之间使用,分割。


具体的格式如下:


  • 名称/值(pair):名称和值之间使用隔开,一般的形式是:

{name:value}

一個名稱是一個字符串;
一个值(value)可以是一个字符串(string),一个数值(number),一个对象(object),一个布尔值(bool),一个有序列表(array),或者一个null值。



  • 字符串:以""括起来的一串字符。

  • 数值:一系列0-9的数字组合,可以为负数或者小数。还可以用e或者E表示为指数形式。

  • 布尔值:表示为true或者false。

  • 值的有序列表(array):一个或者多个值用,分割后,使用[]括起来就形成了这样的列表,形如:


[value, value]

JSON的格式描述可以參考RFC 4627。



应用领域



WEB开发


JSON最开始被广泛的应用于WEB应用的开发。不過目前JSON使用在JavaScript、Java、Node.js應用的情況比較多,PHP、C#等開發的WEB應用主要還是使用XML。



NoSQL数据库


相对于传统的关系型数据库,一些基于文档存储的NoSQL非关系型数据库选择JSON作为其数据存储格式,比较出名的产品有:MongoDB、CouchDB、RavenDB等。



举例


 1 {
2 "firstName": "John",
3 "lastName": "Smith",
4 "sex": "male",
5 "age": 25,
6 "address":
7 {
8 "streetAddress": "21 2nd Street",
9 "city": "New York",
10 "state": "NY",
11 "postalCode": "10021"
12 },
13 "phoneNumber":
14 [
15 {
16 "type": "home",
17 "number": "212 555-1234"
18 },
19 {
20 "type": "fax",
21 "number": "646 555-4567"
22 }
23 ]
24 }

这种JSON格式也被用来当作Minecraft的一个游戏内容:


 1 [
2 {
3 "text": "This is the text",
4 "color": "dark_red",
5 "bold": "true",
6 "strikethough": "true",
7 "clickEvent":
8 {
9 "action": "open_url",
10 "value": "zh.wikipedia.org"
11 },
12 "hoverEvent":
13 {
14 "action": "show_text",
15 "value":
16 {
17 "extra": "something"
18 }
19 }
20 },
21 {
22 "translate": "item.dirt.name",
23 "color": "blue",
24 "italic": "true"
25 }
26 ]


安全問題



读取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方法进行读取[1]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英语MessagePack宣称比JSON更短小,快速。



格式化工具


JSON格式取代了XML给网络传输带来了很大的便利,但是却没有了XML的一目了然,尤其是JSON数据很长的时候,会让人陷入繁琐复杂的数据节点查找中。开发者可以通过在线JSON格式化工具,来更方便的对JSON数据进行节点查找和解析。



參考文獻





  1. ^ JSON and Browser Security. 




參見



  • JSONP

  • AJAX

  • JavaScript

  • YAML

  • HOCON



外部連結




  • (英文) JSON,關於JSON的規格、文件,以及在其他語言實做的資訊

  • JSON中文说明


  • (英文) RFC 4627,JSON在RFC裡的規格

  • JSON格式化工具 (中文)

  • JSON编辑器

  • JSON分析器

  • JSON到CSV转换器

  • Minecraft指令─JSON文字格式

  • JSON在线格式化工具






Comments

Popular posts from this blog

Information security

Lambak Kiri

章鱼与海女图