JSON是JavaScript Object Notation的缩写,中文译为JavaScript对象表示法。用来做为数据交换的文本格式,做用相似于XML,而2001年Douglas Crockford提出的目的就是为了取代XML,它不是一种编程语言,仅用来描述数据结构。python
它只是一个字符串,它只是一个有规则的字符串,或者说带有特定数据结构的字符串。(重点)而后它的表达(表现)形式是键值对的。正则表达式
JSON基于两种结构:"名称/值”对 的集合(A collection of name/value pairs),在不一样的编程语言中有不一样的描述数据库
如:对象(object),纪录(record),结构(struct),字典(dictionary) 哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array) 值的有序列表。编程
在大部分语言中,它被实现为数组(array),矢量(vector),列表(list),序列(sequence)json
JSON的语法能够表示如下三种类型的值:简单值、JSON对象和数组。数组
(1)简单值服务器
// 简单值 "Hello World!" // 字符串 99 // 数值 true // 布尔型 false // 布尔型 null // 在JSON中不能使用的值 NaN // 数值不能是NaN Infinity // 数值不能是Infinity undefined // 在JSON也不可使用JavaScript中的undefined 'Hello World!' // 字符串必须使用双引号表示,不能使用单引号 0x1 // 数值必须以十进制表示,不能使用十六进制
(2)对象网络
对象是一组有序的键值对的数据组成的数据类型。键值对中,值能够是简单值,也能够是对象和数组(数组也是用来表示JSON的数据类型)数据结构
// 对象,对象的属性名必须使用双引号,值要是字符串也必须使用双引号 { "name": "Andy", "age": 18, "isStudent": true, "isLeader": false, "mark": null, "school": { "name": "BIT", "region": "Beijing" // 这个地方不能有逗号,由于是对象的最后一个属性成员 } // 这个地方也不能够有逗号,由于也是对象的最后一个属性成员 }
(3)数组less
数组是由一组有序的数组组成的列表。在数组中,值能够是简单值,也能够是对象和数组。
// 示例一 ["Andy", "Ruby", "Danny", "Peter", "Lisa"] // 示例二 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] // 示例三 [ {"name": "Andy", "age": 18}, {"name": "Ruby", "age": 18}, {"name": "Danny", "age": 20} ] // 示例四 [ [0, 1, 2], [3, 4, 5], [6, 7, 8] ]
使用Python编码和解析Json
Python内置了json包来帮助咱们完成对json的操做。
将Python的字典结构导出到json使用json.dumps()
,将json读成Python的字典结构,使用json.loads()
。
若是不是针对string操做而是对文件操做,分别使用json.load()
函数和json.dump()
函数。
import json python_data = { 'name' : 'wqbin', 'shares' : 100, 'price' : 542.23 } json_str = json.dumps(python_data) python_data = json.loads(json_str) # Writing JSON python_data to file with open('python_data.json', 'w') as f: json.dump(python_data, f) # Reading python_data back with open('python_data.json', 'r') as f: python_data = json.load(f)
python数据类型与json数据类型对比:
BSON(Binary Serialized Document Format)是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON同样,支持内嵌的文档对象和数组对象,可是BSON有JSON没有的一些数据类型,如Date和BinData类型。
BSON能够作为网络数据交换的一种存储形式,这个有点相似于Google的Protocol Buffer,可是BSON是一种schema-less的存储形式,它的优势是灵活性高,但它的缺点是空间利用率不是很理想。
BSON有三个特色:轻量性、可遍历性、高效性。
{“hello":"world"} 这是一个BSON的例子,其中"hello"是key name,它通常是cstring类型,字节表示是cstring::= (byte*) "/x00" ,其中*表示零个或多个byte字节,/x00表示结束符;后面的"world"是value值,它的类型通常是string,double,array,binarydata等类型。
MongoDB使用了BSON这种结构来存储数据和网络数据交换。
把这种格式转化成文档(Document)这个概念,由于BSON是schema-free的,因此在MongoDB中所对应的文档也有这个特征,这里的一个Document也能够理解成关系数据库中的一条记录(Record),
文档是对数据的抽象,它被使用在Client端和Server端的交互中。全部的Client端(各类语言的Driver)都会使用这种抽象。
MongoDB以BSON作为其存储结构的一种重要缘由是其可遍历性。
效率
BSON是为效率而设计的,它只须要使用不多的空间。即便在最坏的状况下,BSON格式也比JSON格式再最好的状况下存储效率高。
在某些状况下,BSON会牺牲额外的空间让数据的传输更加方便。好比,字符串的传输的前缀会标识字符串的长度,而不是在字符串的末尾打上结束的标记。这样的传输形式有利于MongoDB修改传输的数据。
//null值 db.mycol.insert({x:null}) WriteResult({ "nInserted" : 1 }) //布尔型 db.mycol.insert({x:true}) WriteResult({ "nInserted" : 1 }) //小数 db.mycol.insert({x:3.1515}) WriteResult({ "nInserted" : 1 }) //整数 db.mycol.insert({x:3}) WriteResult({ "nInserted" : 1 }) //4字节带符合整数 db.mycol.insert({x:NumberInt("3")}) WriteResult({ "nInserted" : 1 }) //8字节带符号整数 db.mycol.insert({x:NumberLong("3")}) WriteResult({ "nInserted" : 1 }) //字符型 db.mycol.insert({x:"robin"}) WriteResult({ "nInserted" : 1 }) //日期型 db.mycol.insert({x:new Date()}) WriteResult({ "nInserted" : 1 }) //正则表达式 db.mycol.insert({x:/u01/i}) WriteResult({ "nInserted" : 1 }) //数组 db.mycol.insert({x:["a","b","c"]}) WriteResult({ "nInserted" : 1 }) //嵌套文档 db.mycol.insert({x:{y:"nested"}}) WriteResult({ "nInserted" : 1 }) //对象id db.mycol.insert({x:ObjectId()}) WriteResult({ "nInserted" : 1 }) //代码段 db.mycol.insert({x:function(){/ This is a test code /}}) WriteResult({ "nInserted" : 1 }) //undefined类型 db.mycol.insert({name:undefined}); WriteResult({ “nInserted” : 1 })
mongoDB数据类型的比较与排序优先级
{ title:"MongoDB", last_editor:"192.168.1.122", last_modified:new Date("27/06/2011"), body:"MongoDB introduction", categories:["Database","NoSQL","BSON"], revieved:false }
2.复杂嵌套型
{ name:"lemo", age:"12", address:{ city:"suzhou", country:"china", code:215000 }, scores:[ {"name":"english","grade:3.0}, {"name":"chinese","grade:2.0} ] }
每个数据库都由多个名字空间组成,每个名字空间存储了相应类型的数据。数据库中的每个Collection都有各自对应的名字空间,索引文件一样也有名字空间。全部名字空间的元数据都存储在.ns文件中。
名字空间中的数据在磁盘中分为多个区间,这个叫作盘区。在下图中,foo这个数据库包含3个数据文件,第三个数据文件属于空的预分配文件。头两个数据文件被分为了相应的盘区对应不一样的名字空间。
MongoDB目前支持的存储引擎为内存映射引擎。当MongoDB启动的时候,会将全部的数据文件映射到内存中,而后操做系统会托管全部的磁盘操做。
(这里的意思就是,MongoDB中的数据能够经过Java中的new操做设置一个对象,进而将对象映射到内存中,内存根据指针等实现对磁盘的操做)
这种存储引擎有如下几种特色:
mongoDB中每个文档都必须有一个"_id"键,该键等同于RDBMS中的主键,只不过这个主键是由mongoDB自动生成
"_id"键的值可使用任意类型,能够不使用系统建立,而由用户自定义的规则生成
"_id"为轻量级,全局惟一,可类比为MySQL数据中的GTID,也用于解决不一样机器副本集复制时惟一性问题
a 4-byte value representing the seconds since the Unix epoch, //时间戳 a 3-byte machine identifier, //机器惟一标识码 a 2-byte process id, and //进程ID a 3-byte counter, starting with a random value. //随机数
db.mycol.findOne() { “_id” : ObjectId(“57ce2d4cce8685a6fd9df3a3”), “x” : null } 57ce2d4c //时间戳 ==>1473129804 ==> 2016/9/6 10:43:24 ce8685 //机器惟一标识码 a6fd //进程ID 9df3a3 //随机数