zoukankan      html  css  js  c++  java
  • 从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!" // 字符串
    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)数组

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

    // 示例一
    ["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 //随机数
  • 相关阅读:
    php select socket
    php socket获取客户端IP地址
    php长连接
    Socket 深度探究 4 PHP (三)
    Socket 深度探究 4 PHP (二)
    Socket 深度探索 4 PHP (一)
    进阶系列(10)——反射
    ASP.NET MVC5 基础系列(2)——模型绑定
    进阶系列(7)——委托与事件
    ASP.NET MVC5 基础系列(4)——表单和HTML辅助方法
  • 原文地址:https://www.cnblogs.com/wqbin/p/11802794.html
Copyright © 2011-2022 走看看