what is json

Network Working Group                                       D. Crockford
Request for Comments: 4627                                      JSON.org
Category: Informational                                        July 2006

 The application/json Media Type for JavaScript Object Notation (JSON)
Status of This Memo
   This memo provides information for the Internet community.  It does not specify an Internet standard of any kind.  Distribution of this memo is unlimited.
Copyright Notice
   Copyright (C) The Internet Society (2006).
 
 
英文版地址 http://www.ietf.org/rfc/rfc4627.txt?number=4627
 

摘要

JavaScript Object Notation (JSON) 是一種輕量級、基於文本、語言無關的數據交換格式。它是從ECMAScript語言標準衍生而來的。JSON爲輕便的表示結構化數據,定義了一小套格式化規則

1.  說明

JSON是結構化數據串行化的文本格式。它衍生自Javascript的對象實字,這定義在ECMAScript語言標準第三版中。
JSON能夠描述四種簡單的類型(字符串、數字、布爾值及null)和兩種結構化類型(對象及數組)。
字符串(string)是零個或多個Unicode字符的序列。
對象(object)是無次序的零個或多個名/值(name/value)對的集合,這裏的name是string類型,value則可以是string、number、boolean、null、object或array類型。
數組(array)是零個或多個value的有序序列。
"object"和"array"這兩個術語來自JavaScript規範。
JSON的設計目標是使它成爲小的、輕便的、文本的,而且是JavaScript的一個子集。  
1.1.  本文檔使用的術語/約定
本文檔中的關鍵字:"MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT", "SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"MAY"和"OPTIONAL",按照[RFC2119]中所描述的來解釋。
本文檔中的語法規則按照[RFC4234]中所描述的來解釋。 

2.  JSON語法

JSON文本是一個標記符的序列。這套標記符包含六個構造字符、字符串、數字和三個實字名。
JSON文本一個串行化的對象或數組。
  • JSON-text = object / array
以下是六個構造字符:
  • begin-array     = ws %x5B ws  ; [ 左方括號
  • begin-object    = ws %x7B ws  ; { 左大括號
  • end-array       = ws %x5D ws  ; ] 右方括號
  • end-object      = ws %x7D ws  ; } 右大括號
  • name-separator  = ws %x3A ws  ; : 冒號
  • value-separator = ws %x2C ws  ; , 逗號

在這六個構造字符的前或後允許存在無意義的空白符。

  • ws = *(
                %x20 /              ; 空格符
                %x09 /              ; 水平製表符
                %x0A /              ; 換行符
                %x0D                ; 回車符
         )
2.1.  值
JSON必須(MUST)是一個對象、數組、數字或字符串,或者是下面三個實字名之一:
  • false null true

實字名必須(MUST)是小寫的,且不允許有其它的實字名。

  • value = false / null / true / object / array / number / string
    false = %x66.61.6c.73.65   ; false
    null  = %x6e.75.6c.6c      ; null
    true  = %x74.72.75.65      ; true
2.2.  對象

對象結構被表示爲:一對大括號包圍着零個或多個name/value對(或者是成員) 。名是string類型的。每個名後面根一個冒號,把名與值分開。逗號則隔開緊跟在值後的另一個名。對象中的這些名應該(SHOULD)是唯一的。

  • object = begin-object [ member *( value-separator member ) ] end-object
  • member = string name-separator value
2.3.  數組
數組結構表示爲:方括號包圍着零個或多個值(或是元素)。元素間以逗號相隔。
  • array = begin-array [ value *( value-separator value ) ] end-array
2.4.  數字
數字的表示法與其它多數編程語言相似。一個數字包括一個可能帶着負號的整數成分,它後面可能跟着一個小數部分或是指數部分。
不允許有八進制及十六進制形式。前面帶有0也是被禁止的。
小數部分是一個小數點後跟着一個或多個阿拉伯數字。
指數部分以大寫或小寫的E開頭,E後面可以跟一個正/負號。接着是一個或多個阿拉伯數字。
數字值不能表示成阿拉伯數字數字的序列(如Infinity和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語言家族的規範類似。string以引號開始與結束。所有的Unicode字符都可以放置在引號中,除了轉義字符:引號、反斜杆\、控制符(U+0000 - U+001F)。
所有的這些字符都因該避免。如果字符在基本的多語言環境中(U+0000 - U+FFFF),它可以以這樣的六字符序列表示:一個反斜杆,後面跟一個字母U,再跟四個字符代號的十六進制編碼的阿拉伯數字。A - F這些十六進制字母可以小寫。所以像只包含一個反斜杆的字符可以表示成:"\u005C"。
另一種辦法,可以用兩個轉義字符序列來表示一些常用的字符。所以像只包含一個反斜杆字符的字符串可以更簡潔的表示成"\\"。
轉義一個在多語言環境中不存在的字符,這個字符可以表示成一個12字符的序列,編碼爲UTF-16的代用對(UTF-16 surrogate pair)。所以像只包含一個G音譜字符的字符串可以表示爲"\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個字符的0部分,來判斷8字節的流是UTF-8還是UTF-16(BE or LE),或者是UTF-32(BE or LE)。
  •                       00 00 00 xx  UTF-32BE
               00 xx 00 xx  UTF-16BE
               xx 00 00 00  UTF-32LE
               xx 00 xx 00  UTF-16LE
               xx xx xx xx  UTF-8

4. 解析器

JSON解析器將JSON文本轉換成其它的表現形式。它必須(MUST)能夠接受符合JSON語法的所有文本。解析器也可以(MAY)接受非JSON的形式或一些擴展。
實現中,可以設置限制它所接受的文本大小,可以限制JSON文本的最大深度,可以設置數的範圍,也可以限制字符串中的字符長度。

5. 生成器

JSON生成器生成JSON文本。目標文本必須(MSUT)嚴格遵守JSON的語法。 

6. IANA Considerations

JSON文本的MIME類型是application/json。
類型名:application
圖表類型名:JSON
必需的參數:n/a
可選的參數:n/a
編碼選擇: 8bit if UTF-8; binary if UTF-16 or UTF-32
  • JSON may be represented using UTF-8, UTF-16, or UTF-32.  When JSON is written in UTF-8, JSON is 8bit compatible.  When JSON is written in UTF-16 or UTF-32, the binary content-transfer-encoding must be used. 
安全考慮:
  1. 腳本語言通常都有安全問題。JSON是JavaScript的子集,但是它是一個撤消了附值與調用的安全子集。
  2. JSON文本可以安全的傳遞個JavaScript的eval()函數。如果字符沒有被裝入JSON標記符中的標記中,這可以通過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 has been used to exchange data between applications written in all of these programming languages: ActionScript, C, C#, ColdFusion, Common Lisp, E, Erlang, Java, JavaScript, Lua, Objective CAML, Perl, PHP, Python, Rebol, Ruby, and Scheme.
其它額外信息(略) 

7. Security Considerations

參考第六節中的Security Considerations。

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] 
            }
       }
該對象的Image成員是一個對象,而Image的Thumbnail成員也是一個對象,且Image的IDs成員是一個數組。
下面是一個包含兩個對象JSON數組:
  •    [
          {
             "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. 
   [UNICODE] The Unicode Consortium, "The Unicode Standard Version 4.0",
             2003, http://www.unicode.org/versions/Unicode4.1.0/.

 

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