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

原文  http://laichendong.com/rfc4627-zh_cn/

 

摘要

JavaScript Object Notation (JSON)是一個輕量級的,基於文本的,跨語言的數據交換格式。它從ECMAScript編程語言標準(ECMAScript Programming Language Standard)衍生而來。JSON定義了一組用於表示結構化數據的可移植的格式化規則。

1. 簡介

JavaScript Object Notation (JSON)是用於結構化數據序列化的一種文本格式。它基於ECMAScript Programming Language Standard, Third Edition [ECMA]定義的JavaScript對象字面量。

JSON包含4種基礎類型(字符串,數字,布爾和null)和兩種結構類型(對象和數組)

字符串是一個由零或者多個Unicode字符組成的序列。

對象是一個由零或者多個名/值對組成的無序集合,其中名/值對中名是字符串類型,值則可以是字符串,數字,布爾,null,對象或數組類型。

數組是一個由零或者多個值組成的有序序列。

術語“對象”和“數組”的叫法來源於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 
[email protected]

預期的用法: COMMON

受限制的用法: 無

作者:

Douglas Crockford 
[email protected]

修改控制者:

Douglas Crockford 
[email protected]

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.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章