JSON数据交换格式

Douglas Crockford在2001年发现并命名了JSON(JavaScript Object Notation) ,但是据他自己说,JSON很早就存在,自己只是发现了它而已。2002年Crockford通过json.org公开JSON的具体定义。当时正是XML盛行的年代,但到现在更轻量级、容易解析的JSON已经超越XML被大家广泛使用。 


到2013年12月为止, 关于JSON共有4个公开的定义: 

1. json.org

2. IETF RFC 7159, March 2014, Obsolete RFC 4627(July 2006). 

3. ECMAScript Version 5.1 - Section 5.1.5 The JSON Grammar

4. ECMA-404, October 2013


参考文档:

1. https://www.ibm.com/developerworks/community/blogs/HermannSW/entry/the_diff_between_json_rfc4627_txt_and_rfc7159_txt?lang=en

2. http://stamm-wilbrandt.de/en/blog/diff.rfc4627-rfc7159.txt


----------------------------------------------------------------------

The JSON Data Interchange Format, ECMA-404, 1st Edition, October 2013

介绍

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。


    JSON中两个主要类型:

    . “名称/值”对的集合(A collection of name/value pairs)。

        不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),映射(map), 

 哈希表(hash table)。

     . 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array),有键列表(keyed list),或者向量 (vector).

      这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。


4. JSON text

   JSON text是由一序列tokens组成,每个token是遵循JSON值语法形成的Unicode code points.

   tokens集合包括6个结构化tokens, strings, numbers, 以及3个字面量name tokens.


   6个结构化tokens包括:

   [ U+005B 左方括号, left square bracket

   { U+007B 左花括号, left curly bracket

   ] U+005D 右方括号, right square bracket

   } U+007D 右方括号, right curly bracket

   : U+003A colon

   , U+002C comma


   3个字面量name tokens:

   true U+0074 U+0072 U+0075 U+0065

   false U+0066 U+0061 U+006c U+0073 U+0065

   null U+006E U+0075 U+006C U+006C


   任何一个token前后可以有whitespace. 

   whitespace字符包括:character tabulation (U+0009), line feed (U+000A), carriage return (U+000D), and space (U+0020). 

   除了string中允许有space以外, 其他token中不允许有Whitespace,


5. json值

   json值可以是object, array, number, string, true/false, null. 


6. 对象(object)

   对象是一个无序的name/value对集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。

   每个name是一个string, name与value之间以一个“:”(冒号)分隔;name/value对之间使用“,”(逗号)分隔。


7. 数组(array)

   数组是0个或多个值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。


8. 数值(number)

   数值是十进制, 可以是正负值, 有小数点, e/E指数, 0-9


9. 字符串(string)

   字符串是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。

     \"表示双引号 quotation mark  (U+0022)

     \\表示反斜线 reverse solidus (U+005C)

     \/表示正斜线 solidus         (U+002F)

     \b表示       backspace       (U+0008)

     \f           formfeed        (U+000C)

     \n表示新行   newline         (U+000A)

     \r表示       carriage return (U+000D)

     \t表示       horizontal tab  (U+0009)

基本多语言Plane(U+0000 ~ U+FFFF)可以用6个字符来表示:一个反斜线, 一个小写字母u, 后面四位十六进制数字, 

     十六进制数字可以是0-9, A-F, a-f。

      下面四种情况都表示同样结果:

      "\u002F"

      "\u002f"

      "\/"

      "/"


----------------------------------------------------------------------

RFC 7159, March 2014, Category: Standards Track

1. 介绍

   JSON可以用四个基本类型(strings, numbers, booleans, and null), 以及两个结构类型(objects and arrays)来表示.


1.2 JSON规范

   本文档更新了[RFC4627], 该文档描述了JSON, 注册了media type为"application/json".

   

1.3 本次修订介绍

   自RFC4627发布以来, 存在一些互操作问题, 且该文档发现存在一些错误需要修订。


2. JSON语法

   JSON text是由一序列tokens组成.

   tokens集合包括6个结构化字符, strings, numbers, 以及3个字面量name.

   

   JSON text是一个序列化值(a serialized value).  

   之前的一些JSON规范限制JSON text只能是一个object或一个array.

   只生成objects或arrays的JSON text的实现是可以互操作的, 因为所有的实现都接受这些JSON text.

   

   JSON-text = ws value ws

   

  6个结构化字符(structural characters)包括:

      begin-array     = ws %x5B ws  ; [ left square bracket

      begin-object    = ws %x7B ws  ; { left curly bracket

      end-array       = ws %x5D ws  ; ] right square bracket

      end-object      = ws %x7D ws  ; } right curly bracket

      name-separator  = ws %x3A ws  ; : colon

      value-separator = ws %x2C ws  ; , comma

 

  这6个结构化字符前后可以有whitespace:

      ws = *(

              %x20 /              ; Space

              %x09 /              ; Horizontal tab

              %x0A /              ; Line feed or New line

              %x0D )              ; Carriage return


3. value

  value = false / null / true / object / array / number / string

  

  以下3个字面量name必需是小写。

  false = %x66.61.6c.73.65   ; false

  null  = %x6e.75.6c.6c      ; null

  true  = %x74.72.75.65      ; true 


4. objects

   object = begin-object [ member *( value-separator member ) ] end-object


   member = string name-separator value

   

   一个object中的name应当是唯一, 如果接收到name不唯一的对象,则软件行为不可预测。

   许多实现只上报最后一个name:value, 有的实现上报一个error或解析失败, 有的实现将重复的name:value pairs都上报。

   

   已经观察到有一些JSON解析库在是否将object memebers前后顺序通知给调用软件存在差异。

   不依赖于object中memeber前后顺序的实现才是可互操作的, 因为不会受到这些差异的影响。


5. Arrays

   数组是用[]包住的0个或多个values(也称为elements), element之间以逗号分隔。

   

   array = begin-array [ value *( value-separator value ) ] end-array

   

   array中的的values不需要是相同的类型。

      

6. Numbers

   Leading zeros are not allowed.

   

   不能以下面语法表示的Numeric values(例如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

  

   本规范允许实现设置可接收number的范围和精度。

   在 [-(2**53)+1, (2**53)-1] 范围内的整数是可互操作的。


7. Strings

   以下字符必须转义:双引号、反斜线、控制字符(U+0000 ~ U+001F).

   任何字符可以转义,如果字符是基本多语言Plane(U+0000 ~ U+FFFF)可以用6个字符来表示:一个反斜线, 一个小写字母u, 后面四位十六进制数字, 

     十六进制数字可以是0-9, A-F, a-f。

   为了转义不在Basic Multilingual Plane中的扩展字符,该字符可用12个字符序列来表示, 以UTF-16 surrogate pair编码。

   例如只包含G clef character (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

 

8. String和Character问题


8.1.  Character Encoding

   JSON text应当(SHALL)用UTF-8, UTF-16, 或UTF-32来编码. 缺省编码是UTF-8, 以UTF-8编码的JSON texts是可互操作的, 可以被最大多数的实现者成功读取。

   有许多实现不能成功地读取其他方式编码(例如UTF-16和UTF-32)的text.


   实现一定不要(MUST NOT)在JSON text开始处添加一个字节序标志(a byte order mark), 

   考虑到互操作, 解析JSON texts的实现可以(MAY)忽略这个字节序标志, 而不要视之为错误。

   

8.2.  Unicode Characters

   在JSON text中当所有的strings都完全是由Unicode characters [UNICODE] (however escaped)组成的,

   所有的软件实现在解析这种text时可对objects与arrays中name与string值的内容达成一致,因此该JSON text是可互操作的。


   但是, 本规范中的ABNF允许member的names与string values可包含不用Unicode characters编码的比特序列;

   例如"\uDEAD" (a single unpaired UTF-16 surrogate).  

   已经观察到有这种情况发生,例如when a library truncates a UTF-16 string without checking whether the truncation split a surrogate pair. 

   当软件接收包含这些值的JSON texts时行为是无法预测的; 

   例如实现可能对一个类型为string的value的长度返回不同的值, 或者出现致命运行时异常。

   

8.3.  String Comparison

   软件实现通常要测试object members的name是否相等. 

   实现需要将textual表示转换为Unicode code units序列, 然后一个一个code unit进行比较,

   这种实现可对两个串是否相等还是不等的所有情况达成一致, 因此是可互操作的.

   例如, 当对包含有转义字符的串未做转换时进行比较, 可能会错误地认为"a\\b"与"a\u005Cb"不等.


9. Parsers

   JSON解析器将一个JSON text转换为另一种表示.  

   JSON解析器必须(MUST)接受遵循JSON语法的所有texts。

   JSON解析器可以(MAY)接受非JSON格式或扩展.


   实现可以(may)对接受的text size设置限制.  

   实现可以(may)对嵌套最大深度设置限制.

   实现可以(may)对numbers的范围和京都设置限制.

   实现可以(may)对strings的长度和字符内容设置限制.


10. Generators

   JSON生成器(generator)产生JSON text, 最终的text必须(MUST)严格遵循JSON语法(grammar).

   

11.  IANA Considerations

   JSON text的MIME media type是application/json.


   Type name:  application

   Subtype name:  json

   Required parameters:  n/a

   Optional parameters:  n/a


   Encoding considerations:  binary

   Security considerations:  See [RFC7159], Section 12.

   Interoperability considerations:  Described in [RFC7159]

   Published specification:  [RFC7159]


   Applications that use this media type:

      JSON has been used to exchange data between applications written

      in all of these programming languages: ActionScript, C, C#,

      Clojure, ColdFusion, Common Lisp, E, Erlang, Go, Java, JavaScript,

      Lua, Objective CAML, Perl, PHP, Python, Rebol, Ruby, Scala, and

      Scheme.


   Additional information:

      Magic number(s): n/a

      File extension(s): .json

      Macintosh file type code(s): TEXT


   Person & email address to contact for further information:

      IESG

      <iesg@ietf.org>


   Intended usage:  COMMON


   Restrictions on usage:  none


   Author:

      Douglas Crockford

      <douglas@crockford.com>


   Change controller:

      IESG

      <iesg@ietf.org>


13.  举例

   下面是一个JSON object:

      {

        "Image": {

            "Width":  800,

            "Height": 600,

            "Title":  "View from 15th Floor",

            "Thumbnail": {

                "Url":    "http://www.example.com/image/481989943",

                "Height": 125,

                "Width":  100

            },

            "Animated" : false,

            "IDs": [116, 943, 234, 38793]

          }

      }

   该对象的Image member是个object, 其Thumbnail member是个object, IDs member是一个由numbers组成的array.


   下面是一个JSON array, 它包含两个objects:

      [

        {

           "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"

        }

      ]


    下面是3个小的只包含values的JSON texts:

    "Hello world!"

    42

    true


转载于:https://my.oschina.net/1pei/blog/363058

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值