由于目前所做的项目采用extjs+struts,使用了JSon的数据格式来传送数据,所以目前需要对JSON进行一次系统性的学习和了解。首先对JSON的概念进行介绍,然后对开发中关心最多的JSON字符串与对像之间的相互转换进行叙述。
引用:http://ssgemail.javaeye.com/blog/36776
摘要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文本一个串行化的对象或数组。
以下是六个构造字符:
在这六个构造字符的前或后允许存在无意义的空白符。
%x20 / ; 空格符
%x09 / ; 水平制表符
%x0A / ; 换行符
%x0D ; 回车符
)
2.1. 值
JSON必须(MUST)是一个对象、数组、数字或字符串,或者是下面三个实字名之一:
实字名必须(MUST)是小写的,且不允许有其它的实字名。
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)是唯一的。
2.3. 数组
数组结构表示为:方括号包围着零个或多个值(或是元素)。元素间以逗号相隔。
2.4. 数字
数字的表示法与其它多数编程语言相似。一个数字包括一个可能带着负号的整数成分,它后面可能跟着一个小数部分或是指数部分。
不允许有八进制及十六进制形式。前面带有0也是被禁止的。
小数部分是一个小数点后跟着一个或多个阿拉伯数字。
指数部分以大写或小写的E开头,E后面可以跟一个正/负号。接着是一个或多个阿拉伯数字。
数字值不能表示成阿拉伯数字数字的序列(如Infinity和Nan是不允许的)。
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"。
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
JSON文SHALL被编码为Unicode。缺省的编码为UTF-8。
因为JSON文本的开头两个字符总是ASCII字符[RFC0020],我们可以通过查看前面4个字符的0部分,来判断8字节的流是UTF-8还是UTF-16(BE or LE),或者是UTF-32(BE or LE)。
00 xx 00 xx UTF-16BE
xx 00 00 00 UTF-32LE
xx 00 xx 00 UTF-16LE
xx xx xx xx UTF-8
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
安全考虑:
var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
text.replace(/"(\\.|[^"\\])*"/g, ''))) &&
eval('(' + text + ')');
互用性考虑: n/a
发布的规范: RFC 4627
使用该媒体类型的应用程序:
其它额外信息(略)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"
}
]