JSON
接触了web网络编程和爬虫等方面之后,经常会看到大家使用json文件来传输数据。
简介
JavaScript对象表示法(JavaScript Object Notation)是一种开放标准的文件格式使用了人类易读的格式去传送对象数据,包含了属性—值,对和数组类型(或者可串化得值)。这是一种非常普遍得数据格式用于异步浏览器——服务器交互,包括取代XML在一些AJAX-风格得系统中。
json是一种语言无关的数据格式。它来源于javascript,但2017之后很多编程语言都将包含了产生Json数据格式和解析它的代码。JSON的官方Internet媒体类型是application/ JSON。JSON文件名使用扩展名. JSON。
一个名为I-JSON(“Internet JSON”的缩写)的JSON受限概要文件试图克服JSON的一些互操作性问题。
数据类型、语法和示例
JSON的基本数据类型是:
- Number:一种带符号的十进制数字,可以包含小数部分,也可以使用指数E表示法,但不能包含非数字,如NaN。格式不区分整数和浮点数。JavaScript对所有数值使用双精度浮点格式,但是其他实现JSON的语言对数字的编码可能有所不同。
- String:由零个或多个Unicode字符组成的序列。字符串用双引号分隔,并支持反斜杠转义语法。
- Boolean:值的真或假
- Array:由零个或多个值组成的有序列表,每个值可以是任何类型的。数组使用方括号表示法,元素用逗号分隔。
- Object:名称-值对的无序集合,其中的名称(也称为键)是字符串。因为对象是用来表示关联数组的,所以建议,虽然不是必需的,每个键在一个对象中是唯一的。对象用大括号分隔,并使用逗号分隔每对,而在每对中冒号’:'字符将键或名称与其值分隔开。
- null:使用单词null的空值
允许在语法元素(值和标点符号,但不允许在字符串值中)周围或之间使用有限的空格,并忽略它们。为此,只考虑四个特定字符:空格、水平制表符、换行符和回车符。特别是,字节顺序标记不能由符合规范的实现生成(尽管在解析JSON时可以接受它)。JSON不提供注释语法。
举个例子:
{
"firstName": "John",
"lastName": "Smith",
"isAlive": true,
"age": 27,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021-3100"
},
"phoneNumbers": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "office",
"number": "646 555-4567"
},
{
"type": "mobile",
"number": "123 456-7890"
}
],
"children": [],
"spouse": null
}
数据可移植性问题
虽然Douglas Crockford最初声称JSON是JavaScript的一个严格子集,但他的规范实际上允许无效的JSON文档。具体来说,JSON允许Unicode行终止符U+2028行分隔符和U+2029段分隔符在带引号的字符串中不转义,而ECMAScript 2018和更老版本则不允许。这是JSON只允许“控制字符”的结果。为了获得最大的可移植性,这些字符应该反斜杠转义。在生成JSONP时,这一点非常重要。
开放生态系统中的JSON交换必须使用UTF-8编码。编码支持完整的Unicode字符集,包括基本多语言平面(U+10000到U+10FFFF)之外的字符。但是,如果转义,这些字符必须使用UTF-16代理对来编写,一些JSON解析器忽略了这个细节。例如,包括Emoji字符U + 1 f602?脸上喜悦的泪水在JSON:
{ “face”: “?” }
// or
{ “face”: “\uD83D\uDE02” }