从json到python解析python,从bson到monogdb

1.JSON

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

1.二、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]
]

2.2python解析json

使用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数据类型对比:

 

 

 

2.Bson

2.1 bson的概念

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等类型。

2.2 使用状况

MongoDB使用了BSON这种结构来存储数据和网络数据交换。

把这种格式转化成文档(Document)这个概念,由于BSON是schema-free的,因此在MongoDB中所对应的文档也有这个特征,这里的一个Document也能够理解成关系数据库中的一条记录(Record),

文档是对数据的抽象,它被使用在Client端和Server端的交互中。全部的Client端(各类语言的Driver)都会使用这种抽象。

当Client端要将写入文档,使用查询等等操做时,须要将文档编码为BSON格式,而后再发送给Server端。一样,Server端的返回结果也是编码为BSON格式再放回给Client端的。

MongoDB以BSON作为其存储结构的一种重要缘由是其可遍历性。

使用BSON格式出于如下3种目的:
  • 效率

    BSON是为效率而设计的,它只须要使用不多的空间。即便在最坏的状况下,BSON格式也比JSON格式再最好的状况下存储效率高。

  • 传输性

    在某些状况下,BSON会牺牲额外的空间让数据的传输更加方便。好比,字符串的传输的前缀会标识字符串的长度,而不是在字符串的末尾打上结束的标记。这样的传输形式有利于MongoDB修改传输的数据

  • 性能
    BSON格式的编码和解码都是很是快速的。它使用了C风格的数据表现形式,这样在各类语言中均可以高效地使用。

2.3数据类型演示

//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数据类型的比较与排序优先级

  1. MinKey (internal type)
  2. Null
  3. Numbers (ints, longs, doubles)
  4. Symbol, String
  5. Object
  6. Array
  7. BinData
  8. ObjectId
  9. Boolean
  10. Date
  11. Timestamp
  12. Regular Expression
  13. MaxKey (internal type)

2.3格式案例

BSon和JSON同样,支持内嵌的文档对象和数组对象,可是BSON有JSON没有的一些数据类型,如Date和BinData类型。
1.简单型
{
    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}
    ]
}

2.4mongo与Bson

数据文件

在MongoDB的数据文件夹中(默认路径是/data/db)由构成数据库的全部文件。 每个数据库都包含一个.ns文件和一些数据文件,其中数据文件会随着数据量的增长而变多。
因此若是有一个数据库名字叫作foo,那么构成foo这个数据库的文件就会由foo.ns,foo.0,foo.1,foo.2等等组成。
数据文件每新增一次,大小都会是上一个数据文件的2倍,每一个数据文件最大2G。这样的设计有利于防止数据量较小的数据库浪费过多的空间,同时又能保证数据量较大的数据库有相应的空间使用。
MongoDB会使用预分配方式来保证写入性能的稳定(这种方式可使用–noprealloc关闭), 预分配的方式能够减小碎片。预分配在后台进行,而且每一个预分配的文件都用0进行填充。这会让MongoDB始终保持额外的空间和空余的数据文件,从而避免了数据增加过快而带来的分配磁盘空间引发的阻塞。

名字空间和盘区

每个数据库都由多个名字空间组成,每个名字空间存储了相应类型的数据。数据库中的每个Collection都有各自对应的名字空间,索引文件一样也有名字空间。全部名字空间的元数据都存储在.ns文件中。

名字空间中的数据在磁盘中分为多个区间,这个叫作盘区。在下图中,foo这个数据库包含3个数据文件,第三个数据文件属于空的预分配文件。头两个数据文件被分为了相应的盘区对应不一样的名字空间。

每个名字空间能够包含多个不一样的盘区,这些盘区并非连续的。与数据文件的增加相同,每个名字空间对应的盘区大小的也是随着分配的次数不断增加的。
这样作的目的是为了平衡名字空间浪费的空间与保持某一个名字空间中数据的连续性。还有一个须要注意的名字空间: $freelist,这个名字空间用于记录再也不使用的盘区(被删除的Collection或索引)。
每当名字空间须要分配新的盘区的时候,都会先查看$freelist是否有大小合适的盘区可使用。

内存映射存储引擎

MongoDB目前支持的存储引擎为内存映射引擎当MongoDB启动的时候,会将全部的数据文件映射到内存中,而后操做系统会托管全部的磁盘操做。

(这里的意思就是,MongoDB中的数据能够经过Java中的new操做设置一个对象,进而将对象映射到内存中,内存根据指针等实现对磁盘的操做)

这种存储引擎有如下几种特色:

  1. MongoDB中关于内存管理的代码很是精简,毕竟相关的工做已经有操做系统进行托管。
  2.  MongoDB服务器使用的虚拟内存将很是巨大,并将超过整个数据文件的大小。不用担忧,操做系统会去处理这一切。
  3. MongoDB没法控制数据写入磁盘的顺序,这样将致使MongoDB没法实现writeahead日志的特性。因此,若是MongoDB但愿提供一种durability的特性,须要实现另一种存储引擎。
  4.  32位系统的MongoDB服务器每个Mongod实例只能使用2G的数据文件。这是因为地址指针只能支持32位。

关于_id与Object_Id

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 //随机数
相关文章
相关标签/搜索