`
阅读更多

摘要

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,
             
             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/.
作者联系方式 
   Douglas Crockford
   JSON.org
   EMail: douglas@crockford.com
完整的版权声明 
   Copyright (C) The Internet Society (2006).
   This document is subject to the rights, licenses and restrictions
   contained in BCP 78, and except as set forth therein, the authors
   retain all their rights.
   This document and the information contained herein are provided on an
   "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
   OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
   ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
   INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
   INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
   WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. 
知识产权 
   The IETF takes no position regarding the validity or scope of any
   Intellectual Property Rights or other rights that might be claimed to
   pertain to the implementation or use of the technology described in
   this document or the extent to which any license under such rights
   might or might not be available; nor does it represent that it has
   made any independent effort to identify any such rights.  Information
   on the procedures with respect to rights in RFC documents can be
   found in BCP 78 and BCP 79.
   Copies of IPR disclosures made to the IETF Secretariat and any
   assurances of licenses to be made available, or the result of an
   attempt made to obtain a general license or permission for the use of
   such proprietary rights by implementers or users of this
   specification can be obtained from the IETF on-line IPR repository at
   http://www.ietf.org/ipr.
   The IETF invites any interested party to bring to its attention any
   copyrights, patents or patent applications, or other proprietary
   rights that may cover technology that may be required to implement
   this standard.  Please address the information to the IETF at
   ietf-ipr@ietf.org. 
鸣谢 
   Funding for the RFC Editor function is provided by the IETF
   Administrative Support Activity (IASA).
分享到:
评论
2 楼 pangbuddy 2009-03-17  
     
1 楼 不想长大 2008-07-15  
 

相关推荐

    什么是json的介绍.txt

    json

    Json反序列化

    一、什么是JSON反序列化? 当一个Web服务端通过HTTP响应返回JSON格式的数据时,客户端(如浏览器或服务器端脚本)需要将这些数据转换为本地语言的数据结构,以便进行进一步的处理和操作。这个过程就叫做JSON反序列化...

    Unity版Newtonsoft.Json

    首先,让我们了解什么是JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它是互联网应用间通信的常用格式。而Newtonsoft.Json是.NET平台上最...

    java FASTJSON 解析复杂JSON实例源码

    首先,让我们了解什么是JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript的一个子集,但不依赖于JavaScript,因此在各种语言中...

    通过Gson解析Json文件

    首先,我们需要了解什么是JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON数据通常以键值对的形式存在,可以表示复杂的数据结构,如数组、...

    WinCe,Json类库

    **什么是JSON?** JSON是一种数据交换格式,它基于JavaScript语法,但独立于语言,具有自我描述性,易于人阅读和编写,也便于机器解析和生成。它常用于前后端交互,API数据传输,以及存储轻量级配置文件。 **WinCe中...

    Java_读写json格式的文件方法详解

    首先,需要了解什么是 JSON 格式,JSON 格式是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。JSON 格式通常用来在 Web 应用程序中交换数据,以便于实现数据的传输和存储。 在 Java 中...

    json文件是什么+为什么使用json文件+如何使用json文件

    JSON 文件是什么?为什么使用 JSON 文件?如何使用 JSON 文件? JSON 文件是什么? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,于 21 世纪初由 Douglas Crockford 提出。该格式旨在解决数据...

    javaWeb添加json支持需要的jar文件

    1. **什么是JSON?** JSON是一种基于文本的数据格式,易于人阅读和编写,同时也易于机器解析和生成。它的语法结构与JavaScript对象类似,但JSON是语言无关的,可以被多种编程语言处理。 2. **为什么要用JSON in ...

    MFC使用json11解析JSON

    json11::Json jsonObject = json11::Json::parse(jsonString); if (jsonObject.is_object()) { // 处理解析成功的对象 } else { // 处理解析错误 } ``` 一旦你有了JSON对象,可以访问其成员或进行修改。例如,...

    json转换jsonschema

    而JSON Schema则是一个JSON格式的规范,用于定义JSON数据的结构和限制,类似于XML Schema,它为JSON数据提供了验证规则,确保数据的准确性和一致性。 在JavaScript开发中,有时我们需要将JSON对象转换为JSON Schema...

    JSON 开发教程 和实例

    1.1 什么是 JSON? JSON是一种基于文本的数据格式,它由键值对(key-value pairs)组成,这些键值对以冒号分隔,而各个对之间用逗号分隔。JSON的数据结构主要包括对象(objects)和数组(arrays)。对象以大括号{}...

    json paser 属于idea插件 用于解析json

    json paser 属于idea插件 用于解析json json paser 属于idea插件 用于解析json json paser 属于idea插件 用于解析json json paser 属于idea插件 用于解析json json paser 属于idea插件 用于解析json json paser 属于...

    JsonView查看JSON利器

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛应用于Web服务与客户端之间的数据传输。它易于人阅读和编写,同时也易于机器解析和生成。JsonView是一款优秀的浏览器扩展,专门设计用来帮助...

    JSON-RPC for Java使用说明.doc

    首先,让我们了解什么是 JSON-RPC。JSON-RPC 是一种基于 JSON(JavaScript Object Notation)的远程过程调用协议,使用 JSON 编码数据进行数据交换。它的主要特点是轻量级、零入侵、级联调用,非常适合在 Java 应用...

Global site tag (gtag.js) - Google Analytics