json规范,平时不注意的特殊符号
今天在做项⽬的过程中发现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                ; -json值的类型有哪些
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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。