从json到python解析python,从bson到monogdb
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)都会使用这种抽象。
MongoDB以BSON做为其存储结构的一种重要原因是其可遍历性。
效率
BSON是为效率而设计的,它只需要使用很少的空间。即使在最坏的情况下,BSON格式也比JSON格式再最好的情况下存储效率高。
- 传输性
在某些情况下,BSON会牺牲额外的空间让数据的传输更加方便。比如,字符串的传输的前缀会标识字符串的长度,而不是在字符串的末尾打上结束的标记。这样的传输形式有利于MongoDB修改传输的数据。
- 性能
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数据类型的比较与排序优先级
- MinKey (internal type)
- Null
- Numbers (ints, longs, doubles)
- Symbol, String
- Object
- Array
- BinData
- ObjectId
- Boolean
- Date
- Timestamp
- Regular Expression
- MaxKey (internal type)
2.3格式案例
{
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
数据文件
名字空间和盘区
每一个数据库都由多个名字空间组成,每一个名字空间存储了相应类型的数据。数据库中的每一个Collection都有各自对应的名字空间,索引文件同样也有名字空间。所有名字空间的元数据都存储在.ns文件中。
名字空间中的数据在磁盘中分为多个区间,这个叫做盘区。在下图中,foo这个数据库包含3个数据文件,第三个数据文件属于空的预分配文件。头两个数据文件被分为了相应的盘区对应不同的名字空间。
内存映射存储引擎
MongoDB目前支持的存储引擎为内存映射引擎。当MongoDB启动的时候,会将所有的数据文件映射到内存中,然后操作系统会托管所有的磁盘操作。
(这里的意思就是,MongoDB中的数据可以通过Java中的new操作设置一个对象,进而将对象映射到内存中,内存根据指针等实现对磁盘的操作)
这种存储引擎有以下几种特点:
- MongoDB中关于内存管理的代码非常精简,毕竟相关的工作已经有操作系统进行托管。
- MongoDB服务器使用的虚拟内存将非常巨大,并将超过整个数据文件的大小。不用担心,操作系统会去处理这一切。
- MongoDB无法控制数据写入磁盘的顺序,这样将导致MongoDB无法实现writeahead日志的特性。所以,如果MongoDB希望提供一种durability的特性,需要实现另外一种存储引擎。
- 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的更多相关文章
- 使用Python解析JSON数据
使用Python解析百度API返回的JSON格式的数据 # coding:utf-8 # !/usr/bin/env python import matplotlib.pyplot as plt fr ...
- 使用Python解析JSON数据的基本方法
这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下: ----------------------------------- ...
- python 解析json loads dumps
认识 引用模块 重要函数 案例 排序 缩进参数 压缩 参考 认识 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standa ...
- Python 解析构建数据大杂烩 -- csv、xml、json、excel
Python 可以通过各种库去解析我们常见的数据.其中 csv 文件以纯文本形式存储表格数据,以某字符作为分隔值,通常为逗号:xml 可拓展标记语言,很像超文本标记语言 Html ,但主要对文档和数据 ...
- 使用Python解析豆瓣上Json格式数据
现在的API接口多为xml或json,json解析更简洁相对xml来说 以豆瓣的API接口为例,解析返回的json数据: https://api.douban.com/v2/book/1220562 ...
- python解析json数据
现在的API接口多为xml或json,json解析更简洁相对xml来说 以豆瓣的API接口为例,解析返回的json数据: https://api.douban.com/v2/book/1220562 ...
- Python -- Json 数据编码及解析
Python -- Json 数据编码及解析 Json 简单介绍 JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本 ...
- Python解析xml与JSON
xml与json是常用的文件交换格式,常用来表示网页的html则是xml的变种.解析xml和json在web开发中有着重要应用. DOM解析XML 文件对象模型(Document Object Mod ...
- Java 和 Python 解析动态 key 的 JSON 数据
一.概述 解析JSON过程中,什么情况都可能遇到.遇到特殊的情况,不会怎么办?肯定不是设计的问题,一定是你的姿势不对. 有这样一种JSON需要解析: { "b3444533f6544&quo ...
随机推荐
- 洛谷 题解 P2502 【[HAOI2006]旅行】
由于此题边数比较小,所以可以先给边排个序,然后跑m遍最小生成树,每跑一次删除一条边,找最优解. 防TLE技巧 把边按从小到大的顺序排好,那么只要当前无法联通,那么后面也无法联通 最优解找法 doubl ...
- Java开发环境不再需要配置classpath!
前言: 之前发布了关于java开发环境配置的文章,经过与网友的交流,我了解到在jdk1.5以后,java开发环境配置的时候,确实不需要对classpath进行配置,但市面上的书籍,以及一些博客.还是老 ...
- 关于SQLSERVER登录不了的情况
是这样的,本人为了复制一个数据库文件把默认数据库设置成了脱机状态.在此点击联机的时候SSMS显示重启,重启后在用windows登录显示无法打开默认数据库.用其他不适该默认数据库的账号可以登录.想问一下 ...
- vscode+php+xdebug won't stop at breakpoint 断点不起作用
not stopping on breakpoints breakpoint not working 原因: 1) php.ini xdebug 端口不配置的情况下,默认是 9000,如果vscode ...
- 一文看懂java io系统 (转)
出处: 一文看懂java io系统 学习java IO系统,重点是学会IO模型,了解了各种IO模型之后就可以更好的理解java IO Java IO 是一套Java用来读写数据(输入和输出)的A ...
- S02_CH07_ ZYNQ PL中断请求
S02_CH07_ ZYNQ PL中断请求 7.1 ZYNQ 中断介绍 7.1.1 ZYNQ中断框图 可以看到本例子中PL到PS部分的中断经过ICD控制器分发器后同时进入CPU1 和CPU0.从下面的 ...
- VSFTP添加用户
VSFTPD的安装网上有很多教程这里就不多说了,这里主要是针对做主机空间服务的朋友在安装好vsftpd后如何为用户增加ftp账号 先来看一看我们一般在*inux系统下面如何增加用户的 #adduser ...
- 轻松搭建CAS 5.x系列(3)-连接数据库,使用数据库表中的帐号做登录
概要说明 前面的CAS SEVER中的登录帐号名是配置中写死的,实际情况中不太可能用这些方法.通常情况下,数据库的帐号名密码都是在数据库表中的,这样可以对登录帐号进行增删改的处理. 如果您对搭建固定帐 ...
- H5的本地存储(localStorage)和cookie比较
HTML5 的 web Storage 存储方式有两种:localStorage 和 sessionStorage. sessionStorage就像是会话级别的cookie,数据会随着浏览器关闭而清 ...
- Windows 软件使用
1.CMD 1. 查看端口对应进程 netstat -ano|findstr "443" 2.通过PID 查找对应进程 tasklist|findstr “<PID号> ...