Python - BSON 和 JSON

1. JSON

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式, 易于人阅读和编写; 同时也易于机器解析和生成.

介绍 JSON

JSON建构于两种结构:

[1] - “名称/值”对的集合(A collection of name/value pairs)
不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组(associative array).

[2] - 值的有序列表(An ordered list of values). 在大部分语言中,它被理解为数组(array).

2. BSON

BSON 简称二进制的JSON(short for Binary JSON),是 JSON 的二进制序列化编码格式.
类似于 JSON,BSON支持文档数组,BSON支持二进制压缩格式。
类似于 Protocol Buffers,但 BSON 比 ProtocolBuffers 更加自由,无模式,所以BSON支持更加高级复杂的格式,在空间利用方面更加高效.

BSON homepage

BSON 具有三个特性:

[1] - 轻量级(Lightweight)
对于任何数据表示格式,保持空间的开销最低的,尤其是在网络上使用.

[2] - 可遍历(Traversable)
BSON 的设计更加容易的遍历访问.
对于 BSON 在 MongoDB 中作为主要数据表示的一个非常重要的属性.</p>

[3] - 高效(Efficient)
由于使用的C数据类型,使得数据到 BSON 编码和 BSON 解码到数据,可以非常迅速地在大多数语言中.

如:
一个简单的 BSON 结构体,其中每一个element都是由key/value对组成.

{
    title: "MongoDB",
    last_editor: "2018.06.21",
    last_modified:new Date("21/06/2018"),
    body:"MongoDB introduction",
    categories:["Database","NoSQL","BSON"],
    revieved:false
}

如:
嵌套的 BSON 结构体:

{
    name: "MongoDB",
    version: "4.0", 
    records: {
        add: "001", 
        modify: "002",
    } ,
    sublist:[
        {"a":"001", "value: 1.0},
        {"b": "002", "value: 2.0} ]
}

3. BSON 和 JSON 的区别

JSON and BSON - MonogoDB

BSON 是由 10gen 开发的一个数据格式,目前主要用于 MongoDB 中,是 MongoDB 的数据存储格式.
BSON 基于 JSON 格式,选择 JSON 进行改造的原因主要是 JSON 的通用性JSON 的schemaless的特性.

BSON主要会实现以下三点目标:

[1] - 更快的遍历速度
对 JSON 格式来说,太大的 JSON 结构会导致数据遍历非常慢.
在 JSON 中,要跳过一个文档进行数据读取,需要对此文档进行扫描才行,需要进行麻烦的数据结构匹配,比如括号的匹配.
而 BSON 对 JSON 的一大改进就是,它会将 JSON 的每一个元素的长度存在元素的头部,这样只需要读取到元素长度就能直接 seek 到指定的点上进行读取了.

[2] - 操作更简易
对JSON来说,数据存储是无类型的,比如要修改基本一个值,从9到10,由于从一个字符变成了两个,所以可能其后面的所有内容都需要往后移一位才可以.
而使用BSON,可以指定这个列为数字列,那么无论数字从9长到10还是100,我们都只是在存储数字的那一位上进行修改,不会导致数据总长变大.
当然,在MongoDB中,如果数字从整形增大到长整型,还是会导致数据总长变大的.

[3] - 增加了额外的数据类型
JSON 是一个很方便的数据交换格式,但是其类型比较有限.
BSON 在其基础上增加了 “byte array” 数据类型. 这使得二进制的存储不再需要先 base64 转换后再存成JSON.大大减少了计算开销和数据大小.

当然,在有的时候,BSON 相对 JSON 来说也并没有空间上的优势,比如对 {“field”:7},在JSON的存储上 7 只使用了一个字节,而如果用 BSON,那就是至少4个字节(32位).

目前在 10gen 的努力下,BSON 已经有了针对多种语言的编码解码包. 并且都是Apache 2 license下开源的, 并且还在随着MongoDB进一步地发展.

综上所述:

[1] - 数据结构:
JSON 是像字符串一样存储的,BSON 是按结构存储的(像数组或者说struct)

[2] - 存储空间:
BSON > JSON

[3] - 操作速度:
BSON > JSON. 比如,遍历查找:JSON 需要扫字符串,而 BSON 可以直接定位

[4] - 修改:
JSON 也要大动大移,BSON 就不需要.

原文:BSON的介绍以及和JSON的区别

4. Python 之 JSON 和 BSON

4.1 Python 之 JSON

JSON encoder and decoder

import json

## Encoding
json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
# '["foo", {"bar": ["baz", null, 1.0, 2]}]'
print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True))
# {"a": 0, "b": 0, "c": 0}

from io import StringIO
io = StringIO()
json.dump(['streaming API'], io)
io.getvalue()
# '["streaming API"]'

json.dumps([1, 2, 3, {'4': 5, '6': 7}], separators=(',', ':'))
# '[1,2,3,{"4":5,"6":7}]'

print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
# {
#      "4": 5,
#      "6": 7
# }

# Decoding
json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
# ['foo', {'bar': ['baz', None, 1.0, 2]}]

io = StringIO('["streaming API"]')
json.load(io)
# ['streaming API']

4.2 Python 之 BSON

Independent BSON codec for Python that doesn't depend on MongoDB

安装:

sudo pip install bson
import bson

a = bson.dumps({"A":[1,2,3,4,5,"6", u"7", {"C":u"DS"}]})
b = bson.loads(a)
print(b)
# {'A': [1, 2, 3, 4, 5, '6', u'7', {'C': u'DS'}]}
Last modification:November 7th, 2018 at 09:50 pm

Leave a Comment