RFC4627中文版-JSON格式定义
RFC4627中文版-JSON格式定义
近期想稍微研究一下JSON的序列化和反序列化。JSON格式大家都很熟悉,但大多来自于直观的认识。并没有了解过严格的定义。本着学习和练手的心态,将 RFC4627规范给翻译了一下。
感谢 @iwwy 对我那错误满篇的翻译稿进行校对和修正。
———————————- 华丽的分割线 ———————————-
The application/json Media Type for JavaScript Object Notation (JSON)
本文(Memo)的状态
本文提供的是有关互联网通讯的内容。这不是任何形式的互联网标准,你可以随意传播本文而没有任何限制。
版权提示
Copyright (C) The Internet Society (2006)
摘要
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文本是一个对象或者数组的序列化结果。
1
|
JSON - text = object / array |
下面是6种结构字符:
1
2
3
4
5
6
|
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 ; , 逗号 |
6种结构字符前后都可以添加无意义的空白字符。
1
2
3
4
5
6
|
ws = * (
% x20 / ; 空格
% x09 / ; \ t 水平制表符 % x0A / ; \ n 换行符 % x0D ; \ r 回车符
)
|
2.1. 值
JSON值MUST是一个对象,数组,数字,字符串或下列三个字面量之一:
1
|
false null true
|
字面量MUST是小写的,其他任何字面量都是不允许的。
1
2
3
4
|
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是唯一的。
1
2
|
object = begin - object [ member * ( value - separator member ) ] end - object member = string name - separator value |
2.3. 数组
数组结构表示为一对中括号包裹着0到多个值(或者叫元素)。值之间用逗号分隔。
1
|
array = begin - array [ value * ( value - separator value ) ] end - array |
2.4. 数字
数字的表示和其他大部分语言相似。数字包含一个以可选的减号为前缀的整数部分,其
后面可以跟有小数部分和/或指数部分。
八进制或者十六进制的形式是不允许的。以0开头也是不允许的。
小数部分是一个小数点后跟随一位或多位数字。
指数部分以不限大小写的字母E开头,之后可跟一个加号或减号。E和可选的符号后可
跟一位或多位数字。
不能被表示为数字的序列(例如,无穷大和NaN)的数字值是不允许的。
1
2
3
4
5
6
7
8
9
10
|
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”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
string = quotation - mark * char quotation - mark char = unescaped / escape ( 0x22 / ; " 引号 U+0022 0x5C / ; \ 反斜杠 U+005c 0x2F / ; / 斜杠 U+002F 0x62 / ; b 退格符 U+0062 0x66 / ; f 分页符 U+0066 0x6E / ; n 换行符 U+006E 0x72 / ; r 回车符 U+0072 0x74 / ; t 水平制表符 U+0074 0x75 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)编码的。
1
2
3
4
5
|
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方法可以快速的确定是否满足该条件。
1
|
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对象:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
{
"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 ]
}
}
|
这是一个包含两个对象的数组:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
[ {
"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.
作者地址
Douglas Crockford
JSON.org
EMail: douglas@crockford.com
RFC4627中文版-JSON格式定义相关推荐
- Go 实现 json 格式定义 http 协议压测脚本
原文由bugVanisher发表于TesterHome社区,点击原文链接可与作者直接交流. 前段时间,我主导推动组里实现了一套基于Locust+boomer的通用的压测平台,主要目的是满足我们组内的各 ...
- Spring Boot 无侵入式 实现API接口统一JSON格式返回
作者 | 小魏小魏我们去那里呀 来源 | blog.csdn.net/qq_34347620/article/details/102239179 无侵入式 统一返回JSON格式 其实本没有没打算写这篇 ...
- Spring Boot 无侵入式 实现 API 接口统一 JSON 格式返回
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 无侵入式 统一返回JSON格式 其实本没有没打算写这篇博客 ...
- String转成JSON格式
首先引入依赖包,这里使用的是alibaba的fastjson: <!-- fastjson依赖 --><dependency><groupId>com.alibab ...
- C#中怎样将Listlt;自己定义gt;转为Json格式 及相关函数-DataContractJsonSerializer
对C#和.net使用List<自己定义>和Json格式相互转化的方法进行总结 关于JSON的入门介绍见http://www.json.org/ ,或者百度,这里不赘述,只是通过以下的样例会 ...
- Spring MVC--自定义HttpMessageConverter接收JSON格式的数据
替换默认的Jackson,使用fastjson来处理json格式的数据. index.jsp <%@ page language="java" contentType=&qu ...
- netcore读取json文件_.net core读取json格式的配置文件
在.Net Framework中,配置文件一般采用的是XML格式的,.NET Framework提供了专门的ConfigurationManager来读取配置文件的内容,.net core中推荐使用j ...
- python类型转换异常_python知识:json格式文本;异常处理;字符串处理;unicode类型和str类型转换...
python进程中的实例和json格式的字符串之间的映射关系是非常直接的,相当于同一个概念被编码成不同的表示: stream in json form ----json.loads(str)----- ...
- json格式值班表解析
这几天因为一些特殊原因,网站值班表不能用,一旦出现问题,找相应系统的值班人员,就比较困难了,但通过一些渠道,可以有一个文本文件,其中包含了这几天的值班信息,为了更明白的说明问题,我们假设有A系统和B系 ...
最新文章
- 全面探讨PL/SQL的复合数据类型
- centos5.6无法ping,无法scp的问题解析
- 根文件系统使用登录模式
- 由浅入深学“工厂模式”(3)
- java国际规范标准,国际化 - Java Servlet 3.1 规范
- [Noip2018]旅行
- Spring RestController
- 基于改进麻雀算法优化变分模态分解(IAMSSA—VMD)的信号分解方法
- 【Python】实现isPrime()函数判断质数+异常处理
- 自动化搜索ARX密码差分特征的方法
- windows10中charles设置代理,android手机无法上网
- Method_Confusion_Attack_on_Bluetooth_Pairing
- 《淘宝网开店 拍摄 修图 设计 装修 实战150招》导读
- 邓俊辉算法训练营第三期(带完整课件)
- 身份证号码验证——C语小程序言
- 搜索局域网内电脑共享文件的方法
- SAP F1 无法显示该网页 完美解决方案(不用重装SAP)
- 软件著作权申请时间是多久?
- 日志php-error错误日志查看
- 【C4】基于深度学习的心电信号分析