Jimmypony的技术汇总区
很多都不会,很多都不懂,不要浮躁,静心学习

今天在做项目的过程中发现json传值时,有回车符就挂了,在网上找了找资料发现原来json不支持某些特殊符号,使用时需要转义,同时8进制或者16进制的数字也不行 数字以0开头也不行

以下是比较官方的说法:

 

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

 

posted on 2008-09-04 09:05  Jim~  阅读(27251)  评论(2编辑  收藏  举报