(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
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.
(The application/json Media Type for JavaScript Object Notation (JSON))RFC4627-JSON格式定义的更多相关文章
- JSON,全称:JavaScript Object Notation,作为一个常见的轻量级的数据交换格
JSON,全称:JavaScript Object Notation,作为一个常见的轻量级的数据交换格式,应该在一个程序员的开发生涯中是常接触的.简洁和清晰的层次结构使得 JSON 成为理想的数据交换 ...
- 【EatBook】-NO.1.EatBook.1.JavaData.1.001-《JSON 必知必会-Introduction to JavaScript Object Notation》-
1.0.0 Summary Tittle:[EatBook]-NO.1.EatBook.1.JavaData.1.001-<JSON 必知必会-Introduction to JavaScrip ...
- JSON(JavaScript Object Notation, JS 对象标记)
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言 ...
- JSON: JavaScript Object Notation
JSON是JavaScript Object Notation 的缩写,是JS提供的一种数据交换格式.1) JSON对象本质上就是一个JS对象,但是这个对象比较特殊,它可以直接转换为字符串,在不同语言 ...
- JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式
JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 它基于JavaScript(Standard ECMA-262 3rd Edition - D ...
- JSON(二)——JavaScript中js对象与JSON格式字符串的相互转换
首先我们来看一下js中JSON格式的字符串 var JSONStr1 = "{\"name\" : \"张三\"}"; 注意以下的写法不是j ...
- 数据交换格式 —— JSON(JavaScript Object Notation)
当请求 headers 中,添加一个name为 Accept,值为 application/json 的 header(也即"我"(浏览器)接收的是 json 格式的数据),这样, ...
- 解如何利用 XML 和 JavaScript Object Notation 在 Ajax 客户端和 Java 服务器之间传输数据(代码)(Oracle)。
---------------------------------ajaxUtil----------------------------------------------------------- ...
- javascript进击(八)JSON
JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小.更快,更易解析. 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Ob ...
随机推荐
- 020.1.2 Arrays集合工具类
内容:一些关于集合常用方法 在Java.util包里面,可以自己测试一下1.查找2.复制数组3.复制数组指定范围4.排序5.返回hash值6.数组转换成String7.数组转换成集合 Arrays.a ...
- 打包工具的核心原理(转自:https://juejin.im/entry/5b223ebd518825748b569bda)
打包工具就是负责把一些分散的小模块,按照一定的规则整合成一个大模块的工具.与此同时,打包工具也会处理好模块之间的依赖关系,最终这个大模块将可以被运行在合适的平台中. 打包工具会从一个入口文件开始,分析 ...
- WebSocket消息推送
WebSocket协议是基于TCP的一种新的网络协议,应用层,是TCP/IP协议的子集. 它实现了浏览器与服务器全双工(full-duplex)通信,客户端和服务器都可以向对方主动发送和接收数据.在J ...
- Gym 100633G Nano alarm-clocks
题目,给定n个时钟,要求把他们调成一样的时间.求最小的步数 思路:肯定是有一个时钟作为标准的啦,要找到这个时钟,怎么找呢?没其他方便的方法,暴力枚举.那么枚举后,怎么能快速地算到其他时钟转到这个时钟的 ...
- ALICE源代码分析
前言 ALICE(爱丽丝)事实上是"人工语言计算机实体"的英文缩写. 它以前在往年(2000年.2001年和2004年)的勒布纳人工智能奖角逐中三次获胜.并在其它年度中也获过骄人的 ...
- TP,TN,FP,FN
一张图搞定~~~ [转]https://blog.csdn.net/u011956147/article/details/78967145
- 2019.3.5 控制台输出log4j得有些报错信息
报错内容如下 log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.Sp ...
- windows下使用Git
如何在windows下使用Git? 通过这里下载Git bash,你就可以像在Linux命令行一样操作git工具. 进入Git bash环境,默认是在当前用户路径下. 在Linux下,我们有根目录,在 ...
- CSS动画总结效果
CSS3添加了几个动画效果的属性,通过设置这些属性,可以做出一些简单的动画效果而不需要再去借助JavaScript.CSS3动画的属性主要分为三类:transform.transition以及a ...
- 解析oracle对select加锁的方法以及锁的查询 转
转自 https://www.jb51.net/article/37587.htm 本篇文章是对oracle对select加锁的方法以及锁的查询进行了详细的分析介绍,需要的朋友参考下 解析oracle ...