原文 http://laichendong.com/rfc4627-zh_cn/git
摘要正則表達式
JavaScript Object Notation (JSON)是一個輕量級的,基於文本的,跨語言的數據交換格式。它從ECMAScript編程語言標準(ECMAScript Programming Language Standard)衍生而來。JSON定義了一組用於表示結構化數據的可移植的格式化規則。編程
1. 簡介json
JavaScript Object Notation (JSON)是用於結構化數據序列化的一種文本格式。它基於ECMAScript Programming Language Standard, Third Edition [ECMA]定義的JavaScript對象字面量。數組
JSON包含4種基礎類型(字符串,數字,布爾和null)和兩種結構類型(對象和數組)安全
字符串是一個由零或者多個Unicode字符組成的序列。app
對象是一個由零或者多個名/值對組成的無序集合,其中名/值對中名是字符串類型,值則能夠是字符串,數字,布爾,null,對象或數組類型。編程語言
數組是一個由零或者多個值組成的有序序列。ui
術語「對象」和「數組」的叫法來源於JavaScript的習慣叫法。編碼
JSON的設計目標是它應當是儘量小的,可移植的,文本化的,而且能夠做爲JavaScript的一個子集。
1.1. 約定
本文中的」MUST」, 「MUST NOT」, 「REQUIRED」, 「SHALL」, 「SHALL NOT」, 「SHOULD」,」SHOULD NOT」, 「RECOMMENDED」, 「MAY」, 和 「OPTIONAL」 關鍵字意思聽從[RFC2119]中的定義。
本文中的語法規則聽從[RFC4234]中的定義。
2. JSON語法
一個JSON文本是一個標記(token)序列,標記包含6種結構字符,字符串,數字和3個字面量。
一個JSON文本是一個對象或者數組的序列化結果。
JSON-text = object / array
下面是6種結構字符:
begin-array = ws %x5B ws ; [ 左中括號 begin-object = ws %x7B ws ; { 左大括號 end-array = ws %x5D ws ; ] 右中括號
6種結構字符先後均可以添加無心義的空白字符。
ws = * ( % x20 / ; 空格 % x09 / ; \ t 水平製表符 % x0A / ; \ n 換行符 % x0D ; \ r 回車符 )
2.1. 值
JSON值MUST是一個對象,數組,數字,字符串或下列三個字面量之一:
false null true
字面量MUST是小寫的,其餘任何字面量都是不容許的。
value = false / null / true / object / array / number / string false = %0x66.61.6c.73.65 ; false null = %0x6e.75.6c.6c ; null true = %0x74.72.75.65 ; true
2.2. 對象
對象結構表示爲一對大括號包裹着0到多個名/值對(或者叫成員)。名/值對中名稱是一個字符串,後面是一個冒號,用來分隔名稱和值。值後面是一個逗號用來分隔值和下一個名/值對的名稱。一個對象內的名稱SHOULD是惟一的。
object = begin-object [ member *( value-separator member ) ] end-object
member = string name-separator value
2.3. 數組
數組結構表示爲一對中括號包裹着0到多個值(或者叫元素)。值之間用逗號分隔。
array = begin-array [ value *( value-separator value ) ] end-array
2.4. 數字
數字的表示和其餘大部分語言類似。數字包含一個以可選的減號爲前綴的整數部分,其
後面能夠跟有小數部分和/或指數部分。
八進制或者十六進制的形式是不容許的。以0開頭也是不容許的。
小數部分是一個小數點後跟隨一位或多位數字。
指數部分以不限大小寫的字母E開頭,以後可跟一個加號或減號。E和可選的符號後可
跟一位或多位數字。
不能被表示爲數字的序列(例如,無窮大和NaN)的數字值是不容許的。
number = [ minus ] int [ frac ] [ exp ] decimal-point = %x2E ; . digit1-9 = %x31-39 ; 1-9 e = %x65 / %x45 ; e E exp = e [ minus / plus ] 1*DIGIT frac = decimal-point 1*DIGIT int = zero / ( digit1-9 *DIGIT ) minus = %x2D ; - plus = %x2B ; + zero = %x30 ; 0
2.5. 字符串
字符串的表示和C語言家族的處理方式類似。字符串用引號做爲開頭和結尾。除了如下一些必須被轉義的字符之外全部的Unicode字符均可以直接被放在字符串中:引號(」或’),反斜槓(\)和控制字符(U+0000 到 U+001F)。
任何字符均可以被轉義。若是是在基本多語言平面(Basic Multilingual Plane (U+0000 到 U+FFFF))內,則應該表示爲6字符序列:反斜槓後面跟一個小寫字母u,再跟4位表示字符所在位置的16進制數字。16進制數字中的字母A-F能夠是大寫的,也能夠是小寫的。例如:一個只有一個反斜槓組成的字符串能夠表示爲」\u005C」。
另外,有一些流行的字符能夠用兩字符序列來轉義,例如:一個只有一個反斜槓組成的字符串能夠表示爲」\\」。
要轉義不在基本多語言平面(Basic Multilingual Plane)內的字符,則使用表示爲UTF-16編碼代理對(encoding the UTF-16 surrogate pair)的12字符序列。例如:一個只包含G譜字符(U+1D11E)的字符串能夠被表示爲」\uD834\uDD1E」
string = quotation-mark *char quotation-mark char = unescaped / escape ( %x22 / ; " quotation mark U+0022 %x5C / ; \ reverse solidus U+005C %x2F / ; / solidus U+002F %x62 / ; b backspace U+0008 %x66 / ; f form feed U+000C %x6E / ; n line feed U+000A %x72 / ; r carriage return U+000D %x74 / ; t tab U+0009 %x75 4HEXDIG ) ; uXXXX U+XXXX escape = %x5C ; \ quotation-mark = %x22 ; " unescaped = %x20-21 / %x23-5B / %x5D-10FFFF
3. 編碼
JSON文本SHALL使用unicode編碼。默認的編碼方式爲UTF-8。
因爲JSON文本的頭兩個字符必定是ASCII字符[RFC0020],所以能夠經過觀察第一組4個8位字節來判斷字節流是UTF-8,UTF-16(BE或LE)仍是UTF-32(BE或LE)編碼的。
00 00 00 xx UTF-32BE 00 xx 00 xx UTF-16BE xx 00 00 00 UTF-32LE xx 00 xx 00 UTF-16BE xx xx xx xx UTF-8
4. 解析器
JSON解析器能夠將JSON文本轉換爲其餘表示方法。JSON解釋器MUST能接受符合JSON語法的全部文本。JSON解析器MAY能接受非JSON形式的文本。
5. 生成器
JSON生成器可以生成JSON文本。其生成結果MUST嚴格符合JSON的語法。
6. IANA(互聯網數字分配機構)方面的考慮
JSON文本的MIME媒體類型是application/json。
類型名稱: application
子類型名稱: json
必選參數: n/a
可選參數: n/a
編碼方面的考慮: 若是是UTF-8則是8位字節,若是是UTF-16和UTF-32則是二進制
JSON能夠用UTF-8,UTF-16和UTF-32編碼表示。若是使用UTF-8,則JSON是8位字節兼容的。若是是UTF-16或UTF-32,則必須使用二進制內容傳輸編碼。
安全方面的考慮:
一般,腳本語言都有安全問題,JSON做爲JavaScript的一個子集,但因爲它排除了分配和調用,因此它是安全的。
若是JSON文本中除去字符串部分的字符都是JSON標記(token)字符,則它能夠安全的傳遞給JavaScript的eval()方法(用來編譯和執行一個字符串的方法)。JavaScript中經過分別調用兩個正則表達式的test和replace方法能夠快速的肯定是否知足該條件。
var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(text.replace(/"(\\.|[^"\\])*"/g, ''))) && eval('(' + text + ')');
互操做性方面的考慮:n/a
發佈規範:RFC 4627
使用這個媒體類型的應用程序:
JSON曾被用於用如下全部編程語言編寫的應用程序間傳遞數據:ActionScript, C, C#, ColdFusion, Common Lisp, E, Erlang, Java, JavaScript, Lua, Objective CAML, Perl, PHP, Python, Rebol, Ruby, and Scheme.
額外的信息:
魔術數字: n/a
文件擴展名: .json
Macintosh文件類型的代碼: TEXT
進一步的信息請聯繫:
Douglas Crockford
douglas@crockford.com
預期的用法: COMMON
受限制的用法: 無
做者:
Douglas Crockford
douglas@crockford.com
修改控制者:
Douglas Crockford
douglas@crockford.com
7. 安全方面的考慮
參照第六節中的「安全方面的考慮」。
8. 舉例
這是一個JSON對象:
{ "Image": { "Width": 800, "Height": 600, "Title": "View from 15th Floor", "Thumbnail": { "Url": "http://www.example.com/image/481989943", "Height": 125, "Width": "100" }, "IDs": [116, 943, 234, 38793] } }
這是一個包含兩個對象的數組:
[{ "precision": "zip", "Latitude": 37.7668, "Longitude": -122.3959, "Address": "", "City": "SAN FRANCISCO", "State": "CA", "Zip": "94107", "Country": "US" } ,{ "precision": "zip", "Latitude": 37.371991, "Longitude": -122.026020, "Address": "", "City": "SUNNYVALE", "State": "CA", "Zip": "94085", "Country": "US" }]
9. 參考文獻
9.1. 參考的規範
[ECMA] European Computer Manufacturers Association, 「ECMAScript
Language Specification 3rd Edition」, December 1999,
<http://www.ecma-international.org/publications/files/
ecma-st/ECMA-262.pdf>.
[RFC0020] Cerf, V., 「ASCII format for network interchange」, RFC 20,
October 1969.
[RFC2119] Bradner, S., 「Key words for use in RFCs to Indicate
Requirement Levels」, BCP 14, RFC 2119, March 1997.
[RFC4234] Crocker, D. and P. Overell, 「Augmented BNF for Syntax Specifications: ABNF」, RFC 4234, October 2005.