python simplejson模块浅谈

一、背景知识

  • JSON:

    引用百科描述如下,具体请自行搜索相关介绍:

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard
ECMA-262 3rd Edition - December 1999)的一个子集。
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript,
Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(网络传输速度快)。

表示方法:

    • 数据在名称/值对中
    • 数据由逗号分隔
    • 花括号保存对象
    • 方括号保存数组

示例:

{"programmers":[
{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},
{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},
{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}
],
"authors":[
{"firstName":"Isaac","lastName":"Asimov","genre":"sciencefiction"},
{"firstName":"Tad","lastName":"Williams","genre":"fantasy"},
{"firstName":"Frank","lastName":"Peretti","genre":"christianfiction"}
]}

  • HOWTO-UNICODE:

unicode标准描述了字符如何对应编码点(code point),使用16进制表示 00 00.

PYTHON中,basestring派生了unicode类型和str类型

unicode字符串是一个编码点序列,该序列在内存中会被表示成一组字节(0-255),str是指8字节流。

unicode字符串可以通过encode函数转换为str;str可以通过decode转换为unicode。编解码类型一般是utf-8

示例:

>>> u"中国".encode(‘utf-8‘)
‘\xe4\xb8\xad\xe5\x9b\xbd‘    #将unicode字符串编码为str
>>> ‘\xe4\xb8\xad\xe5\x9b\xbd‘.decode(‘utf-8‘)
u‘\u4e2d\u56fd‘               #将str解码为unicode字符串

从文件中读和写入文件的操作都应该是操作的8位字节流,如果将unicode字符串写入文件,需要进行编码操作;如果从文件中读unicode字符串,首先读取出来的是8位字节流需要进行解码操作。

    一般功能代码中都直接操作unicode字符串,而只在写数据或读数据时添加对应的编解码操作。

  • 序列化和反序列化

    当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二

进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。

把对象转换为字节序列的过程称为对象的序列化,比如把一个字典对象以某种格式(JSON)写到文件中;把字节序列恢复为对象的过程称为对象的反序列化,比如读取某种格式化(JSON)的文件,构造一个字典对象。

根据HOWTO-UNICODE的知识,把网络可以看做是一个文件,发送方写数据到网络时需要进行编码,接收方读取数据时需要进行解码。也就是说序列化的同时会进行编码,反序列化的同时会进行解码。

二、simplejson

simplejson是json标准模块的扩展(基础功能相同),是pypi提供的拓展模块,需要另行安装。不过可以使用python自带的json库,基本是相同的使用方法(提供的接口功能基本一致)。在python的library文档中将JSON归为网络数据控制类,很好的说明了他们的用途,主要用于网络数据控制,编解码等。但是也具有其他的用途,比如可以用来作为配置文件的读写模块,简单的文件操作等。

它提供的接口很少,容易掌握,而且大多数情况下会使用默认的参数。官方文档中阐明,默认的接口参数和不进行子类化会有更好的性能体现。下面我们对提供的接口进行讨论,并且仅展示必须参数,其他关键字参数将以**kwargs表示;

  • simplejson.dump(obj, fp, **kwargs):将python对象写到文件中(以JSON格式)
  • simplejson.dumps(obj, **kwargs):将python对象表示成字符串(JSON的格式)
  • simplejson.load(fp, **kwargs):从文件中(包含JSON结构)读取为python对象
  • simplejson.loads(s, **kwargs):从字符串中(包含JSON结构)读取为python对象
  • class simplejson.JSONDecoder:load/loads的时候调用,将JSON格式序列解码为python对象
  • class simplejson.JSONEncoder:dump/dumps的时候调用,将python对象编码为JSON格式序列

联系到上面的基础知识,我们可以知道,dump的过程其实就是向文件句柄中写数据,即对象序列化的过程,需要进行编码,只是编码的格式不只是unicode和str的转换,而是更重要的python对象类型和JSON对象类型之间的转换。同理,load的过程其实就是从文件句柄中读数据,即反序列化生成对象的过程,需要进行解码,只是解码的格式不只是str和unicode的转换,而是更重要的JSON对象类型和python对象类型之间的转换。

下面是JSON对象类型和Python对象类型之间的对应关系:

JSON Python 2 Python 3
object dict dict
array list list
string unicode str
number (int) int, long int
number (real) float float
true True True
false False False
null None None

下面以一个例子来结束本文,例子中附带注释:

#coding:utf-8
import simplejson as json

#simplejson.dump(**kwargs)
fp = open(‘./text.json‘, ‘w+‘)
json.dump([1,2], fp)         ##将python数组进行序列化,保存到文件中
fp.seek(0)
print "----dump----\n", u‘使用dump将python数组对象保存在一个包含JSON格式的文件中,文件内容为:\n‘, fp.read()
print 
fp.close()         

#simplejson.dumps(**kwargs)
r_dumps = json.dumps({"中国obj":[1,2], "obj2":[3,4]})  #将python字典进行序列化,保存到字符串中
print "----dumps----\n", u‘使用dumps将python字典对象转换为一个包含JSON格式的字符串,字符串结果为:\n‘, r_dumps
print

#simplejson.load(**kwargs)
#如果json文档格式有错误,将会抛出JSONDecoderError异常
fp = open(‘./text.json‘, ‘r‘)
r_load = json.load(fp)           #将文件中的内容转换为python对象
print "----load----\n", u"使用load读取一个包含JSON数组格式的文件后,得到一个python对象,类型是:", type(r_load)
print 
#simplejson.loads(**kwargs)
#如果json文档格式有错误,将会抛出JSONDecoderError异常

#将字符串中的内容转换为一个python对象
r_loads = json.loads(‘‘‘{"programmers":[
{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},
{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},
{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}
],
"authors":[
{"firstName":"Isaac","lastName":"Asimov","genre":"sciencefiction"},
{"firstName":"Tad","lastName":"Williams","genre":"fantasy"},
{"firstName":"Frank","lastName":"Peretti","genre":"christianfiction"}
]}‘‘‘)
print "----loads----\n", u"使用loads读取一个包含JSON字典格式的字符串后,得到一个python对象,类型是:", type(r_loads)
print

运行之后的结果显示:

----dump----
使用dump将python数组对象保存在一个包含JSON格式的文件中,文件内容为:
[1, 2]
----dumps----
使用dumps将python字典对象转换为一个包含JSON格式的字符串,字符串结果为:
{"obj2": [3, 4], "\u4e2d\u56fdobj": [1, 2]}
----load----
使用load读取一个包含JSON数组格式的文件后,得到一个python对象,类型是: <type ‘list‘>
----loads----
使用loads读取一个包含JSON字典格式的字符串后,得到一个python对象,类型是: <type ‘dict‘>
时间: 2024-12-08 19:25:04

python simplejson模块浅谈的相关文章

python 之简单浅谈新式类和旧式类(或称经典类)

#_*_coding:utf-8 _*_ #知识点:经典类和新式类的区别 #父类 class Father(object):     def __init__(self):         self.Fname = 'fffffff'         print 'father.__init__'     def Func(self):         print 'funcfurnc'     def Bar(self):         print 'barbarbar'     def T

Python进阶之浅谈内置方法

目录 有序or无序和可变or不可变 数字类型内置方法 整形 浮点型 字符串类型内置方法 有序or无序和可变or不可变 有序:有索引 无序:无索引 可变:变量值变,id不变 不可变:变量值变,id也变 数字类型内置方法 整形 1.作用 描述年龄,id,身高 2.定义方式 x=10 x=int('10') 3.内置方法 没有内置方法,只有算术运算和比较运算 4.存在一个值还是多个值 一个值 5.有序or无序 整形没有这一说法 6.可变or不可变 整形是不可变的 浮点型 1.作用 描述薪资等 2.定义

浅谈 Python 的模块导入

浅谈 Python 的模块导入 本文不讨论 Python 的导入机制(底层实现细节),仅讨论模块与包,以及导入语句相关的概念.通常,导入模块都是使用如下语句: import ... import ... as ... from ... import ... from ... import ... as ... 一般情况下,使用以上语句导入模块已经够用的.但是在一些特殊场景中,可能还需要其他的导入方式.例如 Python 还提供了 __import__ 内建函数和 importlib 模块来实现动

浅谈五大Python Web框架

http://www.csdn.net/article/2011-02-17/292058 导读:作者飞龙写了一篇<浅谈Python Web框架>,文中他介绍了几个Python Web框架和自己对选择框架的分析.在他看来,用Django来快速开发一些Web运用是很不错的选择.以下是文章内容: 说到Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全列表见: http://wik

【python】浅谈包

python中的包可以理解为模块的集合.每个包也既可以为单包也可以有多个小包组成. Python中的package定义很简单,其层次结构与目录的层次结构相同,但是每个package必须包含一个__init__.py的文件,__init__.py可以为空文件,只要它存在,就表明此目录应被作为一个package处理. 整个包的目录结构如下: package/  ##包的目录 __init__.py ##包含的__init__.py文件 add_sub/    ##小包目录 __init__.py #

浅谈Python Web的五大框架

说到Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界.各种micro-framework.framework不可胜数. 尽管还有一大脚本语言PHP也有不少框架,但远没有Python这么夸张,也正是由于Python Web Framework(Python Web开发框架,以下简称Python框架)太多.所以在Python社区总有关于Python框架孰优孰劣的话题,讨论的时间跨度甚至长达3-5年. Python这么多框架,能挨个玩个遍的人不多,坦白

浅谈 Python 的 with 语句

浅谈 Python 的 with 语句 王 生辉 和 李 骅宸2011 年 12 月 02 日发布 WeiboGoogle+用电子邮件发送本页面 3 引言 with 语句是从 Python 2.5 开始引入的一种与异常处理相关的功能(2.5 版本中要通过 from __future__ import with_statement 导入后才可以使用),从 2.6 版本开始缺省可用(参考 What's new in Python 2.6? 中 with 语句相关部分介绍).with 语句适用于对资源

浅谈 Python 程序和 C 程序的整合

源地址:http://www.ibm.com/developerworks/cn/linux/l-cn-pythonandc/ 概览 Python 是一种用于快速开发软件的编程语言,它的语法比较简单,易于掌握,但存在执行速度慢的问题,并且在处理某些问题时存在不足,如对计算机硬件系统的访问,对媒体文件的访问等.而作为软件开发的传统编程语言—— C 语言,却能在这些问题上很好地弥补 Python 语言的不足.因此,本文通过实例研究如何在 Python 程序中整合既有的 C 语言模块,包括用 C 语言

python浅谈正则的常用方法

python浅谈正则的常用方法覆盖范围70%以上 上一次很多朋友写文字屏蔽说到要用正则表达,其实不是我不想用(我正则用得不是很多,看过我之前爬虫的都知道,我直接用BeautifulSoup的网页标签去找内容,因为容易理解也方便,),而是正则用好用精通的很难(看过正则表的应该都知道,里面符号对应的方法规则有很多,很灵活),对于接触编程不久的朋友们来说很可能在编程的过程上浪费很多时间,今天我把经常会用到正则简单介绍下,如果不是很特殊基本都覆盖使用. 1.正则的简单介绍 首先你得导入正则方法 impo