1.JSON

JSON是JavaScript Object Notation的缩写,中文译为JavaScript对象表示法。用来作为数据交换的文本格式,作用类似于XML,而2001年Douglas Crockford提出的目的就是为了取代XML,它不是一种编程语言,仅用来描述数据结构。

它只是一个字符串,它只是一个有规则的字符串,或者说带有特定数据结构的字符串。(重点)然后它的表达(表现)形式是键值对的。

JSON基于两种结构:"名称/值”对  的集合(A collection of name/value pairs),在不同的编程语言中有不同的描述

如:对象(object),纪录(record),结构(struct),字典(dictionary) 哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array) 值的有序列表。

在大部分语言中,它被实现为数组(array),矢量(vector),列表(list),序列(sequence)

1.2、JSON语法规则

JSON的语法可以表示以下三种类型的值:简单值、JSON对象和数组。

(1)简单值

// 简单值
"Hello World!" // 字符串
// 数值
true // 布尔型
false // 布尔型
null // 在JSON中不能使用的值
NaN // 数值不能是NaN
Infinity // 数值不能是Infinity
undefined // 在JSON也不可以使用JavaScript中的undefined
'Hello World!' // 字符串必须使用双引号表示,不能使用单引号
0x1 // 数值必须以十进制表示,不能使用十六进制

(2)对象

对象是一组有序的键值对的数据组成的数据类型。键值对中,值可以是简单值,也可以是对象和数组(数组也是用来表示JSON的数据类型)

// 对象,对象的属性名必须使用双引号,值要是字符串也必须使用双引号
{
"name": "Andy",
"age": ,
"isStudent": true,
"isLeader": false,
"mark": null,
"school": {
"name": "BIT",
"region": "Beijing" // 这个地方不能有逗号,因为是对象的最后一个属性成员
} // 这个地方也不可以有逗号,因为也是对象的最后一个属性成员
}

(3)数组

数组是由一组有序的数组组成的列表。在数组中,值可以是简单值,也可以是对象和数组。

// 示例一
["Andy", "Ruby", "Danny", "Peter", "Lisa"]
// 示例二
[, , , , , , , , , ]
// 示例三
[
{"name": "Andy", "age": },
{"name": "Ruby", "age": },
{"name": "Danny", "age": }
]
// 示例四
[
[, , ],
[, , ],
[, , ]
]

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" : }) //布尔型 db.mycol.insert({x:true})
WriteResult({ "nInserted" : }) //小数 db.mycol.insert({x:3.1515})
WriteResult({ "nInserted" : }) //整数 db.mycol.insert({x:})
WriteResult({ "nInserted" : }) //4字节带符合整数 db.mycol.insert({x:NumberInt("")})
WriteResult({ "nInserted" : }) //8字节带符号整数 db.mycol.insert({x:NumberLong("")}) WriteResult({ "nInserted" : }) //字符型 db.mycol.insert({x:"robin"})
WriteResult({ "nInserted" : }) //日期型 db.mycol.insert({x:new Date()})
WriteResult({ "nInserted" : }) //正则表达式 db.mycol.insert({x:/u01/i})
WriteResult({ "nInserted" : }) //数组 db.mycol.insert({x:["a","b","c"]})
WriteResult({ "nInserted" : }) //嵌套文档 db.mycol.insert({x:{y:"nested"}})
WriteResult({ "nInserted" : }) //对象id db.mycol.insert({x:ObjectId()})
WriteResult({ "nInserted" : }) //代码段 db.mycol.insert({x:function(){/ This is a test code /}})
WriteResult({ "nInserted" : }) //undefined类型 db.mycol.insert({name:undefined});
WriteResult({ “nInserted” : })

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:"",
address:{
city:"suzhou",
country:"china",
code:
},
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 -byte value representing the seconds since the Unix epoch,  //时间戳
a -byte machine identifier, //机器唯一标识码
a -byte process id, and //进程ID
a -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 //随机数

从json到python解析python,从bson到monogdb的更多相关文章

  1. 使用Python解析JSON数据

    使用Python解析百度API返回的JSON格式的数据 # coding:utf-8 # !/usr/bin/env python import matplotlib.pyplot as plt fr ...

  2. 使用Python解析JSON数据的基本方法

    这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下:     ----------------------------------- ...

  3. python 解析json loads dumps

    认识 引用模块 重要函数 案例 排序 缩进参数 压缩 参考 认识 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standa ...

  4. Python 解析构建数据大杂烩 -- csv、xml、json、excel

    Python 可以通过各种库去解析我们常见的数据.其中 csv 文件以纯文本形式存储表格数据,以某字符作为分隔值,通常为逗号:xml 可拓展标记语言,很像超文本标记语言 Html ,但主要对文档和数据 ...

  5. 使用Python解析豆瓣上Json格式数据

    现在的API接口多为xml或json,json解析更简洁相对xml来说 以豆瓣的API接口为例,解析返回的json数据: https://api.douban.com/v2/book/1220562 ...

  6. python解析json数据

    现在的API接口多为xml或json,json解析更简洁相对xml来说 以豆瓣的API接口为例,解析返回的json数据: https://api.douban.com/v2/book/1220562 ...

  7. Python -- Json 数据编码及解析

    Python  --  Json  数据编码及解析 Json 简单介绍 JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本 ...

  8. Python解析xml与JSON

    xml与json是常用的文件交换格式,常用来表示网页的html则是xml的变种.解析xml和json在web开发中有着重要应用. DOM解析XML 文件对象模型(Document Object Mod ...

  9. Java 和 Python 解析动态 key 的 JSON 数据

    一.概述 解析JSON过程中,什么情况都可能遇到.遇到特殊的情况,不会怎么办?肯定不是设计的问题,一定是你的姿势不对. 有这样一种JSON需要解析: { "b3444533f6544&quo ...

随机推荐

  1. sql语句 两表关联查询计算数量

    select sum(a1.`num`)   from `order_orderlistrow` as a1 INNER JOIN `order_orderlist` as a2 on a1.`ord ...

  2. 洛谷 题解 P2010 【回文日期】

    因为有8个字符,所以可得出每一年只有一个回文日期. 因此只要判断每一年就行了. 做法: 我们先把年倒过来,例如2018年就倒为8102,就得出8102就是回文日期的后四个字符,我们只要判断一下有没有这 ...

  3. Python初始

    一,Python介绍 1.Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时间, ...

  4. std::unique_lock与std::lock_guard分析

    背景 C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢,导致程序出现未定义或异常行为.通常的做法是在修改共享数据成员时进行加锁(mutex).在使用锁 ...

  5. 《xv6 Appendices: PC Hardware and Boot loader》学习笔记

    MIT 6.828 Lecture 2的preparation要求阅读<xv6 book>的附录部分,附录包括"PC Hardware"和"The Boot ...

  6. poj1222(高斯消元法解异或方程组+开关问题)

    题目链接:https://vjudge.net/problem/POJ-1222 题意:给定一个5×6的01矩阵,改变一个点的状态时它上下左右包括它自己的状态都会翻转,因为翻转2次等价与没有翻转,那么 ...

  7. DDL数据库对象管理

    DDL数据库对象管理 约束的分类: 主键约束:primary key 要求主键列数据唯一,并且不允许为空. 外键约束:foreign key 用于在两表之间建立关系,需要指定引用主表的哪一列. 检查约 ...

  8. redis主从复制初识

    一.作用 slave会通过被复制同步master上面的数据,形成数据副本 当master节点宕机时,slave可以升级为master节点承担写操作. 允许有一主多从,slave可以承担读操作,提高读性 ...

  9. Linux基础指令--文件操作

    mkdir a 创建一个名为a的文件夹 touch a.txt 创建一个名为a.txt的文件 mv b sm/ 将文件(夹)b 移动到当前目录下的sm目录下 rm -rf a 删除 a文件 -rf为参 ...

  10. 怎样获取当前文档所有的元素节点(即html标签节点)

    方法1. 使用 document.getElementsByTagName("*"); 方法2. 使用document.querySelectorAll("*" ...