(The application/json Media Type for JavaScript Object Notation (JSON))RFC4627-JSON格式定義

原文  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.

相關文章
相關標籤/搜索