前言
Json(Javascript Object Notation)从Javascript派生而来,它是一种语言无关的数据格式,Json数据格式的文件以.json结尾。
Json数据格式由Douglas Crockford在2000年左右提出的。
RFC4627是描述了Json数据格式的第一份informational状态的RFC文档。2013年,ECMA-404标准化了Json;2017年,RFC8259正式成为Standard状态的RFC文档,标志着Json数据格式正式成为一种标准。另外,ECMA-404与RFC8259始终保持一致。
基本内容
Json是一种用字符来表示数据的数据格式,它的本质就是一个字符串,只不过它用了一些特殊的字符标记来表示不同的类型的数据。
Json中,一切皆字符。
数据格式
结构化标记:
[ ]:方括号用于表示数据类型。
{}:大括号用于表示对象类型。
::冒号用于分隔name/value对。
,:逗号用于分隔value。
在结构化标记前后允许存在空白:
4种空白:
Space(空格),水平Tab,LF(Line Feed),回车(CR)。
允许的值
4数据类型:
object,array,number,string。
以及3中字面值(常量):
true,false,null。
number
number = [ minus ] int [ frac ] [ exp ]decimal-point = %x2E ; .digit1-9 = %x31-39 ; 1-9e = %x65 / %x45 ; e Eexp = e [ minus / plus ] 1*DIGITfrac = decimal-point 1*DIGIT
int = zero / ( digit1-9 *DIGIT )minus = %x2D ; -plus = %x2B ; +zero = %x30 ; 0
3-20-3.143.140.08-0.762.141e52.14E103.68e-5-9.111e10
string
stirng="中间是字符串"
string采用双引号包围,中间是字符串内容。
注意点:
1、必须采用转义表示的符号
" 引号
\ 反斜杠
U+0000-U+001F 控制字符
2、任何字符都可以采用\uxxxx这种形式来表示
对于BMP平面(U+0000 -- U+FFFF)的Unicode字符,直接使用\u xxxx(一共6个字符)的形式,例如\(反斜杠)可以使用\u005c的形式。
对于扩展平面(U+10000 — U+10FFFF)的Unicode字符,如果要采用转义形式,必须使用UTF-16的编码形式,然后采用\uxxxx\uxxxx(一共12个字符)的形式,例如 𠀅 U+20005这个中文,UTF-16编码为
0xD840 0xDC05,那么就可以采用\uD840\uDC05的形式。
记住:第2点的要求是可以,不是必须。
3、一些允许的转义形式
" quotation mark U+0022\ reverse solidus U+005C/ solidus U+002Fb backspace U+0008f form feed U+000Cn line feed U+000Ar carriage return U+000Dt tab U+0009uXXXX U+XXXX
object
object采用大括号包围,内部包含0个或多个name/value对。name必须是Json的string,后面跟上一个冒号,冒号后面是值,值可以任意4中数据类型以及3种字面值。也就是说,object可以嵌套object。name/value之间通过逗号隔开。
示例:
{
"Image": {
"Width": 800,
"Height": 600,
"Title": "View from 15th Floor",
"Thumbnail": {
"Url": "http://www.example.com/image/481989943",
"Height": 125,
"Width": 100
},
"Animated" : false,
"IDs": [116, 943, 234, 38793]
}
}
array
array=[0个或多个成员]
数组成员可以是Json中的4种数据类型,以及3中字面值。也就说,array可以嵌套array。成员之间采用逗号隔开。
示例:
[
{
"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"
}
]
以上内容参考RFC8259。
一些其他Json数据示例(不包括object与array):
"Hello world!"
42
true
注意点
1、RFC8259要求JSON TEXT的传输编码必须为UTF-8。
2、Implemention要注意校验\uxxxx是否为合法的UTF16序列,例如\uDEAD就是一个可能的非法序列,它不表示任何Unicode字符。
3、不要直接比较JSON TEXT,因为结果不确定。例如,JSON TEXT的a\\b和a\u005cb表示的是同样的内容,如果直接比较JSON TEXT,结果会是FALSE,这显然是一个错误的结果。所以,如果要比较JSON TEXT中的内容是否相等,应该先反序列化,然后再进行比较。